【发布时间】:2019-01-03 22:40:30
【问题描述】:
我正在寻找有关 Jackson 如何在不可变类型上使用私有构造函数的文档。使用 Jackson 2.9.6 和 spring boot 2 提供的默认对象映射器运行 jdk-10.0.1
给定 JSON:
{"a":"test"}
并给定一个类似的类:
public class ExampleValue {
private final String a;
private ExampleValue() {
this.a = null;
}
public String getA() {
return this.a;
}
}
反序列化(令人惊讶,至少对我而言)似乎有效。
而这不是:
public class ExampleValue {
private final String a;
private ExampleValue(final String a) {
this.a = a;
}
public String getA() {
return this.a;
}
}
确实如此:
public class ExampleValue {
private final String a;
@java.beans.ConstructorProperties({"a"})
private ExampleValue(final String a) {
this.a = a;
}
public String getA() {
return this.a;
}
}
我的假设是,第一个示例可以工作的唯一方法是使用反射来设置最终字段的值(我假设 java.lang.reflect.AccessibleObject.setAccessible(true) 会这样做。
问题 1:这就是杰克逊在这种情况下的工作方式,我说得对吗?我认为这在不允许此操作的安全管理器下可能会失败?
因此,我个人的偏好是上面的最后一个代码示例,因为它涉及的“魔法”较少,并且在安全管理器下工作。但是,我对我发现的关于 Lombok 和构造函数生成的各种线程感到有些困惑,这些线程过去默认生成 @java.beans.ConstructorProperties(...),但随后将默认更改为不再执行此操作,现在允许使用 lombok.anyConstructor.addConstructorProperties=true
有些人(包括在龙目岛release notes 为v1.16.20)建议:
随着 JDK9 的发布,Oracle 或多或少地破坏了这个注解,因此需要这个突破性的改变。
但我并不清楚这是什么意思,Oracle 破坏了什么?对我来说,使用 JDK 10 和 jackson 2.9.6 似乎可以正常工作。
问题 2:是否有人能够阐明此注释在 JDK 9 中是如何被破坏的,以及为什么 lombok 现在认为不再默认生成此注释。
【问题讨论】:
标签: jackson lombok jackson2 jackson-databind