Java 反序列化@JsonUnwrapped可选<&燃气轮机;现场使用杰克逊

Java 反序列化@JsonUnwrapped可选<&燃气轮机;现场使用杰克逊,java,jackson,optional,jackson-databind,Java,Jackson,Optional,Jackson Databind,我试图将@JsonUnwrapped注释应用于可选的字段,但无法理解为什么反序列化会将该字段变为空值 我编写了一个测试来演示这个问题,并标记了测试失败的地方://throws java.lang.AssertionError 使用相应版本的jackson-datatype-jdk8对jackson-databind:2.9.10.4和jackson-databind:2.11.0进行了尝试。结果是一样的 public class JacksonTest { public static c

我试图将
@JsonUnwrapped
注释应用于
可选的
字段,但无法理解为什么反序列化会将该字段变为空值

我编写了一个测试来演示这个问题,并标记了测试失败的地方:
//throws java.lang.AssertionError

使用相应版本的
jackson-datatype-jdk8
jackson-databind:2.9.10.4
jackson-databind:2.11.0
进行了尝试。结果是一样的

public class JacksonTest {
    public static class Person {
        @JsonUnwrapped
        public MainData mainData;
        @JsonUnwrapped
        public Optional<AdditionalData> additionalData;
    }

    public static class MainData {
        public String name;
    }

    public static class AdditionalData {
        public String address;
    }

    @Test
    public void jsonUnwrappedWithOptionalTest() throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        mapper.registerModule(new Jdk8Module());

        Person expected = new Person();
        expected.mainData = new MainData();
        expected.mainData.name = "Homer";
        expected.additionalData = Optional.of(new AdditionalData());
        expected.additionalData.get().address = "Springfield";

        String json = mapper.writeValueAsString(expected);

        assertThat(json, is("{\"name\":\"Homer\",\"address\":\"Springfield\"}"));

        Person actual = mapper.readValue(json, Person.class);

        assertNotNull(actual.mainData);
        assertThat(actual.mainData.name, is("Homer"));
        assertNotNull(actual.additionalData); // throws java.lang.AssertionError; actual.additionalData is null
        assertThat(actual.additionalData.isPresent(), is(true));
        assertThat(actual.additionalData.get().address, is("Springfield"));
    }
}
公共类JacksonTest{
公共静态类人员{
@JsonUnwrapped
公共主数据主数据;
@JsonUnwrapped
公共可选附加数据;
}
公共静态类主数据{
公共字符串名称;
}
公共静态类附加数据{
公共字符串地址;
}
@试验
public void jsonUnwrappedWithOptionalTest()引发IOException{
ObjectMapper mapper=新的ObjectMapper();
registerModule(新的Jdk8Module());
预期人员=新人员();
expected.mainData=新的mainData();
expected.mainData.name=“Homer”;
expected.additionalData=可选的.of(new additionalData());
应为.additionalData.get().address=“Springfield”;
字符串json=mapper.writeValueAsString(应为);
资产(json,是(“{\”名称\“:\”荷马\“,\”地址\“:\”斯普林菲尔德\“}”);
Person-actual=mapper.readValue(json,Person.class);
assertNotNull(实际的.mainData);
资产(actual.mainData.name,为(“荷马”));
assertNotNull(actual.additionalData);//抛出java.lang.AssertionError;actual.additionalData为null
断言(actual.additionalData.isPresent(),为(true));
断言(actual.additionalData.get().address为(“Springfield”);
}
}
我做错了什么,或者可能只是个bug


解决方法:最后,我添加了一个自定义反序列化程序,使用了
@JsonDeserialize
作为解决方法,但我想找到一个正确的解决方案。

是的,这很可能是一个bug,可能会发布到Alex,谢谢。我试着在Jackson的Git中找到对应的东西。如果找不到答案,我会这么做。是的,很可能是一个bug,可能会发布给Alex,谢谢。我试着在Jackson的Git中找到对应的东西。如果找不到答案,我就这么做。