Java “序列化XML”;选择“;杰克逊的元素
我们有这种形式的XSD:Java “序列化XML”;选择“;杰克逊的元素,java,xml,jackson,xsd,jackson-dataformat-xml,Java,Xml,Jackson,Xsd,Jackson Dataformat 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.
<?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>
到目前为止,一切都很好——我们可以将Jackon 2.11.0与jackson dataformat xml:2.11.2一起使用,很好地序列化“真实”对象。FWIW,我们使用如下配置的映射器:
public XmlMapper payloadMapper(){
var xmlMapper=new xmlMapper();
registerModule(新的JavaTimeModule());
registerModule(新的JaxbAnnotationModule());
返回xmlMapper;
}
现在我们“只”需要包装标签,SomeEndpoint
。我们尝试过的事情:
- 根路径:我们认为可以通过
或@JsonRootName
为POXO注入自定义的“根路径”。我们尝试传递名称,如@JacksonXmlRootElement
或SomeEndpoint.RequestPayload
;不走运SomeEndpoint/RequestPayload
- 包装对象:这似乎是最自然的解决方案,但我们很难获得以属性命名的额外包装标签。尤其是,Jackson不接受这种变体:
这一个仍然输出一个@JsonRootName(value=“SomeEndpoint”) 类终结点包装器{ @JsonTypeInfo(使用=JsonTypeInfo.Id.NAME,include=JsonTypeInfo.As.WRAPPER\u对象) @JsonUnwrapped 目标有效载荷; }
标记:
我们尝试了太多的注释混合,无法在这里计数或复制,但这两种注释似乎“应该有效” 注意:我们一直在使用标记接口而不是@JsonRootName(value=“SomeEndpoint”) 类终结点包装器{ @XmlElements({ @XmlElement(name=“RequestPayload”,type=SomeEndpointRequestPayload.class), @XmlElement(name=“ResponsePayload”,type=SomeEndpointResponsePayload.class), @XmlElement(name=“ErrorPayload”,type=SomeEndpointErrorPayload.class) }) 目标有效载荷; }
来将值限制为三种类型。因为它似乎对杰克逊没有什么影响,为了简单起见,我把它省略了Object
- 解决方法:每个选项可以有一个属性:
这是可行的,但是。。。不,真的吗@数据 @JsonRootName(value=“SomeEndpoint”) 类终结点包装器{ @JsonProperty(value=“请求”) 私有SomeEndpointRequestPayload请求; @JsonProperty(value=“Antwort”) 私有SomeEndpointResponsePayload successResponse; @JsonProperty(value=“Fehlerinformation”) 私有SomeEndpointErrorPayload errorResponse; }
选项
而不创建虚假包装标记的好方法是什么