【问题标题】: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 中存在错误,应该可以正常工作。此外,它是向后兼容的,所以不用担心。

标签: java jackson lombok jackson-databind


【解决方案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 文件中阻止编译的唯一问题。
  • 只是打字错误
猜你喜欢
  • 2018-12-14
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 1970-01-01
  • 2017-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多