如何使杰克逊的序列化包含属性尊重JAXB"必需"属性?

时间:2018-01-02 14:51:02

标签: java xml serialization jaxb jackson

我使用Jackson来支持Jackson和JAXB注释,并将对象序列化为XML。

r$run(host="127.0.0.1", port=8000, swagger=TRUE)

或者,我尝试将XmlMapper xmlMapper = new XmlMapper(); xmlMapper.registerModule(new JacksonXmlModule()); xmlMapper.registerModule(new JaxbAnnotationModule()); xmlMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); 配置为相同的结果。

AnnotationIntrospector

但是,使用JAXB XmlEmelemt的必需属性注释的POJO字段会被忽略,因为JsonInclude.Include.NON_NULL序列化策略会覆盖该标志(忽略null元素并且空标记为没有添加)。

XmlMapper xmlMapper = new XmlMapper();
xmlMapper.setAnnotationIntrospector(
            new AnnotationIntrospectorPair(new XmlJaxbAnnotationIntrospector(), new JacksonAnnotationIntrospector()));
xmlMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

有没有办法保留这个策略,但尊重JAXB的必需标志,并在每次没有值时写一个空元素?

1 个答案:

答案 0 :(得分:0)

事实证明required仅在解组时使用,上述行为为by specification

无论如何,对我有用的是:

选项1

再添加一个自定义JsonSerializer。 对于特定的必需元素(它是另一个元素的组成部分,比如ObjectType),我只需将值设置为空字符串null并将其写出来:

public void serialize(ObjectType obj, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException {
    gen.writeStartObject();
    // write other elements
    String someValue = obj.getSomeValue();
    if (someValue == null) {
        someValue = "";
    }
    gen.writeStringField("some-value", someValue);
    gen.writeEndObject();
}

选项2

fasterxml工作人员在讨论https://github.com/FasterXML/jackson-module-jaxb-annotations/issues/68#issuecomment-355055658

后提出建议

  

子类JaxbAnnotationIntrospector,覆盖方法   findPropertyInclusion()