龙目岛没有创建默认构造函数导致杰克逊数据绑定失败[重复]

Posted

技术标签:

【中文标题】龙目岛没有创建默认构造函数导致杰克逊数据绑定失败[重复]【英文标题】:Lombok not creating default constructor causing jackson-databinding to fail [duplicate] 【发布时间】:2019-03-29 15:59:23 【问题描述】:

我有一个 POJO

@Data
@AllArgsConstrcutor
class Test 

T field1,
T field2,

当我尝试使用 jackson-databind 2.9.3 反序列化它时,它是

com.fasterxml.jackson.databind.exc.InvalidDefinitionException 失败: 无法构造com.mypackage.Test 的实例(没有创作者,比如 默认构造,存在):无法从 Object 值反序列化(无 基于委托或基于属性的创建者)在 [来源:(字符串)

【问题讨论】:

你必须在类的顶部使用 @NoArgsConstructor 注释。 在我将 lombok 升级到 1.16.22 之前,这一切正常 @Sakalya,尝试使用 lombok 最新版本 1.18.2,如果 1.16.22 中存在错误,应该可以正常工作。此外,它是向后兼容的,所以不用担心。 【参考方案1】:

@AllArgsConstructor 为类的每个字段创建一个带有参数的构造函数(因此,在您的情况下,您将获得 Test(T, T))。

对于默认构造函数,您应该添加@NoArgsConstructor 注解:

@Data
@AllArgsConstrcutor // Won't be used by Jackson, but there's no harm in it, per-se
@NoArgsConstructor // Here!
class Test 
    T field1;
    T field2;

【讨论】:

在我将 lombok 升级到 1.16.22 之前,这一切正常【参考方案2】:

当然Lombok 不会生成默认构造函数。

使用:@AllArgsConstrcutor 你说你希望它生成一个包含所有提供参数的构造函数。 因为它自己的 POJO 只需要一个构造函数,那就是它。

如果要生成默认构造函数,请添加:@NoArgsConstructor

【讨论】:

在我将 lombok 升级到 1.16.22 之前,这一切正常 @Sakalya 不,它没有。看到您拼写错误的“AllArgsConstructor”,您的代码甚至无法编译,更不用说运行和生成它不应该的构造函数了。这也不是该 Java 文件中阻止编译的唯一问题。 只是打字错误

以上是关于龙目岛没有创建默认构造函数导致杰克逊数据绑定失败[重复]的主要内容,如果未能解决你的问题,请参考以下文章

没有默认构造函数的杰克逊第 3 方类

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

java 龙目岛和杰克逊与JsonCreator

如何在龙目岛调用超级构造函数

杰克逊错误:没有适合简单类的构造函数

Lombok + Jackson 不可变