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()构造函数。是什么导致了这个问题?
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无法解决某些问题,请按照老式的方式进行操作。 控制台输出: