当前位置: 首页 > 知识库问答 >
问题:

Jackson反序列化失败,因为lombok创建了非默认构造函数

晏树
2023-03-14

Jackson可以在2.6.5中为以下类反序列化json,但在2.8.8中失败。

型号:

public static class Parent {
    public long id;
    public List<Child> children;
}

@RequiredArgsConstructor
public static class Child {
    public long childId;

    @NonNull
    @JsonIgnore
    public Parent parent;

    public Child() { }
}

JSON:

{
  "id": 1,
  "children": [
    {
      "childId": 2
    }
  ]
}

例外情况是:

com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "childId" (class Parent), not marked as ignorable (2 known properties: "children", "id"])

我发现lombok创建的子构造函数导致了这个错误。当我去掉lombok注释或手动创建构造函数时,这种情况就会停止。无论如何,它都应该使用no args Child()构造函数。是什么导致了这个问题?

共有1个答案

景品
2023-03-14

Lombok向生成的构造函数添加注释ConstructorProperties({“parent”})。在Jackson 2.8.8中,这导致构造函数被视为“委托创建者”。

委托创建者允许Jackson将一种类型的对象的json反序列化为另一种类型的Java对象。

在这种情况下,由于龙目生成构造函数{code>@ConstructorProperties({“parent”})子(parent parent){…},Jackson将尝试将子json反序列化为父对象,然后将其传递到构造函数中以创建子对象。然后抛出异常,因为childId不是Parent中的字段。

一种解决方法是配置ObjectMapper,该用于使用自定义JacksonAnnotationINSPECTOR反序列化JSON,因此它不会将构造函数解释为委托创建者。

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setAnnotationIntrospector(new JacksonAnnotationIntrospector().setConstructorPropertiesImpliesCreator(false));

更新

项目lombok的1.16.20版本确实默认lombok.anyConstructor.suppress构造属性为true,正如Roel在他的评论中指出的那样。这使得将lombok升级到最新版本成为解决此问题的另一个解决方案。

 类似资料:
  • 我尝试使用以下代码反序列化API中接收的JSON对象: 我的类使用Lombok生成构造函数、getter和setter,如下所示: 这两个属性都应该是可选的,如果没有提供,则使用类定义中指定的默认值。但是,如果我现在尝试反序列化JSON 字段为。根据我的理解,以及我找到的所有示例代码,应该是一个空列表。 编辑:不是重复的,因为我使用的是没有选项的Lombok

  • 当Jackson请求反序列化为下面写的目标类时,我收到了错误 实际上这个问题很容易通过添加注释来解决,杰克逊需要一个无参数构造函数也是可以理解的。但我有点好奇,当目标类包含多个属性时,如何不发生这样的错误,例如 下面写的完整代码 这是成功和失败请求的CURL。endpoint失败,但endpoint成功 这里还有错误消息 JSON解析错误:无法构造< code >控制器的实例。FooRequest

  • 问题内容: 我正在将Lombok项目与Spring Data JPA一起使用。有什么方法可以将Lombok 与JPA默认构造函数连接? 码: 据我所知,JPA需要默认的构造函数,该构造函数被注解覆盖。有什么解决方法吗? 这段代码给我错误: 问题答案: 更新 根据反馈和John的回答,我已更新了不再使用or的答案,而是通过和创建访问器和变量,通过创建默认构造函数via,最后我们创建了构建器通过via

  • 我使用默认构造函数从子类中设置recordId的值,最初没有使用lombok。最终我决定在这里使用构建器,但现在的问题是lombok构建器在内部覆盖了我的默认构建器,因此从未设置值。

  • @adilooze解决方案

  • 问题内容: 我有一个对象 我用两种方式初始化它 这是输出 似乎builder没有获得默认值。我在属性中添加了注释,对象现在看起来像这样 这是控制台输出 我怎样才能使他们俩都成为? 问题答案: 我的猜测是,这是不可能的(没有删除代码)。但是,为什么不仅仅实现所需的构造函数呢?Lombok旨在使您的生活更轻松,如果Lombok无法解决某些问题,请按照老式的方式进行操作。 控制台输出: