我正在使用 Jackson 2.8.5 和 Java 8 的 ParameterNamesModule (https://github.com/FasterXML/jackson-modules-java8).
当我想使用单个参数对具有单个构造函数的类进行反序列化时,我的问题对于一个用例来说非常具体。这是重现该行为的测试:
public class JacksonTest {
@Test
public void TestReadValue() throws IOException {
ObjectMapper objectMapper = new ObjectMapper()
.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY)
.setVisibility(PropertyAccessor.CREATOR, JsonAutoDetect.Visibility.PUBLIC_ONLY)
.registerModule(new ParameterNamesModule(JsonCreator.Mode.PROPERTIES));
ImmutableIdentity identity = objectMapper.readValue("{\"id\":\"ABCDEF\"}", ImmutableIdentity.class);
assertEquals("ABCDEF", identity.id);
}
private static final class ImmutableIdentity {
private final String id;
public ImmutableIdentity(final String id) {
Objects.requireNonNull(id, "The id must not be null.");
this.id = id;
}
}
}
测试失败,原因:
com.fasterxml.jackson.databind.JsonMappingException:无法构造
JacksonTest$ImmutableIdentity 实例,问题: id 不能是
无效的。在[来源:{“id”:“ABCDEF”};行:1,列:15]
有趣的是,如果我向构造函数添加另一个参数,测试就可以通过。
public class JacksonTest {
@Test
public void TestReadValue() throws IOException {
ObjectMapper objectMapper = new ObjectMapper()
.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY)
.setVisibility(PropertyAccessor.CREATOR, JsonAutoDetect.Visibility.PUBLIC_ONLY)
.registerModule(new ParameterNamesModule(JsonCreator.Mode.PROPERTIES));
ImmutableIdentity identity = objectMapper.readValue("{\"id\":\"ABCDEF\"}", ImmutableIdentity.class);
assertEquals("ABCDEF", identity.id);
}
private static final class ImmutableIdentity {
private final String id;
public ImmutableIdentity(final String id, **final String unused**) {
Objects.requireNonNull(id, "The id must not be null.");
this.id = id;
}
}
}
我真的不喜欢在构造函数中使用无用的参数来使其不那么模糊,因为它在我的业务对象中没有价值,特别是它们例如 ProjectId 或定义我的实体和我的一些抽象 Id也需要手动构建它们。所以我想找到一个杰克逊的配置来支持这一点,但我找不到。
我还在这里为维护者交叉发布:https://github.com/FasterXML/jackson-modules-java8/issues/8