首页 > 解决方案 > 使用 Jackson 序列化 XML“选择”元素

问题描述

我们有一个这种形式的 XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified" version="1.0.0">
    <xs:element name="SomeEndpoint">
        <xs:complexType>
            <xs:choice>
                <xs:element name="RequestPayload">
                    <!-- snip -->
                </xs:element>
                <xs:element name="ResponsePayload">
                    <!-- snip -->
                </xs:element>
                <xs:element name="ErrorPayload">
                    <!-- snip -->
                </xs:element>
            <xs:choice>
        </xs:complexType>
    </xs:element>
</xs:schema>

没关系,如果我们喜欢它;它给了。例如,对于一个请求,我们会得到表单的 XML

<SomeEndpoint>
    <RequestPayload>
        <!-- snip -->
    </RequestPayload>
</SomeEndpoint>

为了我们自己的理智,我们想要三个 POXO,可以这么说:

@JsonTypeName("RequestPayload")
class SomeEndpointRequestPayload {
}

@JsonTypeName("ResponsePayload")
class SomeEndpointResponsePayload {
}

@JsonTypeName("ErrorPayload")
class SomeEndpointErrorPayload {
}

到目前为止,一切都很好——我们可以使用带有 的 Jackon 2.11.0jackson-dataformat-xml:2.11.2序列化“真实”对象就好了。FWIW,我们使用如下配置的映射器:

public XmlMapper payloadMapper() {
    var xmlMapper = new XmlMapper();
    xmlMapper.registerModule(new JavaTimeModule());
    xmlMapper.registerModule(new JaxbAnnotationModule());
    return xmlMapper;
}

现在我们“只”需要那个包装标签,SomeEndpoint. 我们尝试过的事情:

choice在 POXO中实现 XML 而不创建虚假包装标签的好方法是什么?

标签: javaxmljacksonxsdjackson-dataformat-xml

解决方案


推荐阅读