Lombok v1.6.20 不适用于 Jackson

Posted

技术标签:

【中文标题】Lombok v1.6.20 不适用于 Jackson【英文标题】:Lombok v1.6.20 does not work with Jackson 【发布时间】:2018-07-22 18:42:25 【问题描述】:

使用最新Lombok v1.6.20生成的构造函数时,Jackson无法使用构造函数。

例如反序列化时

@Data
@AllArgsConstructor
private static class TestObject 
    private Integer a;
    private String b;

我得到了

    com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of TestObject: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?)
 at [Source: "a":0,"b":"0"; line: 1, column: 2]

    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:270)
    at com.fasterxml.jackson.databind.DeserializationContext.instantiationException(DeserializationContext.java:1456)
    at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1012)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1206)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:314)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:148)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3814)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2858)

它适用于 Lombok 1.6.18。迁移到 Spring Boot 2 时可能会出现此问题。

【问题讨论】:

【参考方案1】:

原因是 Lombok 1.6.20 中的向后不兼容更改。有关详细信息,请参阅 Lombok 更改日志 https://projectlombok.org/changelog 和此错误报告 https://github.com/rzwitserloot/lombok/issues/1563

解决方法是指定 lombok.anyConstructor.addConstructorProperties 配置参数。

【讨论】:

在即将发布的版本中,我们计划为数据类生成一个私有的无参数构造函数,让 Jackson 可以使用它。披露:我是龙目岛开发人员。 @RoelSpilker 感谢提供信息,但 lombok 也应该支持 @Value 类,最终生成参数,因此当使用 -parameters 编译器参数编译时,jackson 可以读取这些名称。 @RoelSpilker 私有无参数构造函数不适用于 lombok @NonNull,我说的对吗?

以上是关于Lombok v1.6.20 不适用于 Jackson的主要内容,如果未能解决你的问题,请参考以下文章

当我通过maven添加依赖时,为什么lombok不起作用?

Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: com/fasterxml/jacks

Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: com/fasterxml/jacks

Lombok @Builder 用于具有强制字段的多级继承中的类

是否有任何 Maven 插件可用于从 Jhipster 中删除生成类的 getter/setter 并添加 lombok [关闭]

Lombok注解