不能让杰克逊和龙目岛一起工作

新手上路,请多包涵

我正在尝试结合杰克逊和龙目岛。这些是我的课:

 package testelombok;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Value;
import lombok.experimental.Wither;

@Value
@Wither
@AllArgsConstructor(onConstructor=@__(@JsonCreator))
public class TestFoo {
    @JsonProperty("xoom")
    private String x;
    private int z;
}

 package testelombok;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.xebia.jacksonlombok.JacksonLombokAnnotationIntrospector;
import java.io.IOException;

public class TestLombok {

    public static void main(String[] args) throws IOException {
        TestFoo tf = new TestFoo("a", 5);
        System.out.println(tf.withX("b"));
        ObjectMapper om = new ObjectMapper().setAnnotationIntrospector(new JacksonLombokAnnotationIntrospector());
        System.out.println(om.writeValueAsString(tf));
        TestFoo tf2 = om.readValue(om.writeValueAsString(tf), TestFoo.class);
        System.out.println(tf2);
    }

}

这些是我添加到 classpth 中的 JAR:

  • 龙目岛: https ://projectlombok.org/downloads/lombok.jar(版本 1.16.10)

  • 杰克逊注释: http ://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-annotations/2.8.2/jackson-annotations-2.8.2.jar

  • 杰克逊核心: http ://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-core/2.8.2/jackson-core-2.8.2.jar

  • 杰克逊数据绑定: http ://repo1.maven.org/maven2/com/fasterxml/jackson/core/jackson-databind/2.8.2/jackson-databind-2.8.2.jar

  • 杰克逊龙目岛: http ://repo1.maven.org/maven2/io/paradoxical/jackson-lombok/1.1/jackson-lombok-1.1.jar

我正在用 Netbeans 编译它(我认为这并不重要,但我无论如何都要报告它以使其完美且忠实地重现)。上面的五个 JAR 保存在项目文件夹内名为“ lib ”的文件夹中(以及“ src ”、“ nbproject test--- “和” build “)。我通过项目属性中的“ 添加 JAR/Folder ”按钮将它们添加到 Netbeans,它们按照上面列表的确切顺序列出。该项目是一个标准的“Java 应用程序”类型的项目。

此外,Netbeans 项目被配置为“ _保存时不编译_”、“ _生成调试信息_”、“ 报告已弃用的 API ”、“ 跟踪 Java 依赖 项”、“ _激活注释处理_”和“ _在编辑器中激活注释处理_”。 Netbeans 中没有显式配置注释处理器或注释处理选项。此外,“ -Xlint:all ”命令行选项在编译器命令行中传递,编译器在外部 VM 上运行。

我的 javac 的版本是 1.8.0_72,我的 java 的版本是 1.8.0_72-b15。我的 Netbeans 是 8.1。

我的项目编译得很好。但是,它在执行过程中会引发异常。例外似乎不是任何看起来容易或明显可修复的东西。这是输出,包括堆栈跟踪:

 TestFoo(x=b, z=5)
{"z":5,"xoom":"a"}
Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Argument #0 of constructor [constructor for testelombok.TestFoo, annotations: {interface java.beans.ConstructorProperties=@java.beans.ConstructorProperties(value=[x, z]), interface com.fasterxml.jackson.annotation.JsonCreator=@com.fasterxml.jackson.annotation.JsonCreator(mode=DEFAULT)}] has no property name annotation; must have name when multiple-parameter constructor annotated as Creator
 at [Source: {"z":5,"xoom":"a"}; line: 1, column: 1]
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:296)
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:269)
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
    at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142)
    at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:475)
    at com.fasterxml.jackson.databind.ObjectMapper._findRootDeserializer(ObjectMapper.java:3890)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3785)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2833)
    at testelombok.TestLombok.main(TestLombok.java:14)
Caused by: java.lang.IllegalArgumentException: Argument #0 of constructor [constructor for testelombok.TestFoo, annotations: {interface java.beans.ConstructorProperties=@java.beans.ConstructorProperties(value=[x, z]), interface com.fasterxml.jackson.annotation.JsonCreator=@com.fasterxml.jackson.annotation.JsonCreator(mode=DEFAULT)}] has no property name annotation; must have name when multiple-parameter constructor annotated as Creator
    at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._addDeserializerConstructors(BasicDeserializerFactory.java:511)
    at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._constructDefaultValueInstantiator(BasicDeserializerFactory.java:323)
    at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory.findValueInstantiator(BasicDeserializerFactory.java:253)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:219)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:141)
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:406)
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:352)
    at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264)
    ... 7 more

我已经尝试过随机戳 @Value@AllArgsConstructor 注释,但我无法让它变得更好。

我用谷歌搜索了这个例外, 发现了一个关于 jackson 的旧错误报告另一个是打开的,但似乎与其他东西有关。但是,这仍然没有说明这个错误是什么或如何修复它。另外,我在其他地方找不到任何有用的东西。

由于我要做的是对 lombok 和 jackson 的非常基本的用法,因此我找不到任何有关如何解决此问题的有用信息似乎很奇怪。也许我错过了什么?

除了说“ _不要使用龙目岛_”或“ _不要使用杰克逊_”之外,有人知道如何解决这个问题吗?

原文由 Victor Stafusa - FORABOZO 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 338
1 个回答

如果你想要不可变但使用 lombok 和 jackson 的 json 可序列化的 POJO。在你的 lomboks 构建器上使用 jacksons new annotation @JsonPOJOBuilder(withPrefix = "") 我尝试了这个解决方案并且效果很好。示例用法

import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;
import lombok.Builder;
import lombok.Value;

@JsonDeserialize(builder = Detail.DetailBuilder.class)
@Value
@Builder
public class Detail {

    private String url;
    private String userName;
    private String password;
    private String scope;

    @JsonPOJOBuilder(withPrefix = "")
    public static class DetailBuilder {

    }
}

如果你有太多类 @Builder 并且你不想样板代码空注释你可以覆盖注释拦截器有空 withPrefix

 mapper.setAnnotationIntrospector(new JacksonAnnotationIntrospector() {
        @Override
        public JsonPOJOBuilder.Value findPOJOBuilderConfig(AnnotatedClass ac) {
            if (ac.hasAnnotation(JsonPOJOBuilder.class)) {//If no annotation present use default as empty prefix
                return super.findPOJOBuilderConfig(ac);
            }
            return new JsonPOJOBuilder.Value("build", "");
        }
    });

您可以使用 @JsonPOJOBuilder 注释删除空的构建器类。

原文由 ganesan dharmalingam 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题