XmlMapper 将 XmlProperty 反序列化为 XmlElement

XmlMapper deserializing XmlProperty as XmlElement

我正在编写一个需要使用 XML 发出 POST 请求的应用程序。我已经从 XSD 模式生成了 XML 类,现在正尝试使用 XmlMapper 生成所述请求的主体。

我有以下 类:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "header", propOrder = {
    "createdOn"
})
public class MessageHeader {

    @XmlElement(required = true)
    protected MessageCreatedOn createdOn;

    ...
    ...
    ...
}

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "messageCreatedOn")
public class MessageCreatedOn {

    @XmlAttribute(name = "value", required = true)
    @XmlSchemaType(name = "dateTime")
    protected XMLGregorianCalendar value;
    
    ...
    ...
    ...
}

以及以下 XmlMapper 配置:

final XmlMapper objectMapper = XmlMapper.builder()
        .defaultUseWrapper(false)
        .build();
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"));
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);


String result = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(messageBase);

具有依赖性:

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.10.3</version>
</dependency>

我希望结果是:

<header>
    <createdOn value="2021-08-18T14:06:14.493+03:00"/>
</header>

但结果是:

  <header>
    <createdOn>
      <value>2021-08-18T14:06:14.493+03:00</value>
    </createdOn>
  </header>

我应该更改什么才能使 value 成为 createdOn 元素的属性。

当您使用 JAXB 注释作为元数据时,您需要指示 Jackson 使用这些注释。否则它将使用默认值,XML 的 Jackson 注释,或者当不存在时,一切都将成为一个元素。

要启用 JAXB 注释处理,请将 JaxbAnnotationModule 添加到 XmlMapper。这让 Jackson 使用 JAXB 注释来提供映射元数据。

final XmlMapper objectMapper = XmlMapper.builder()
        .defaultUseWrapper(false)
        .defaultDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"))
        .serializationInclusion(JsonInclude.Include.NON_EMPTY)
        .addModule(new JaxbAnnotationModule())
        .build();

此外,理想情况下,您的 XmlMapper 应该是一个单例 bean,而不是在您每次需要时都创建它。另一个注意事项,如果您使用 Spring,您实际上应该使用 RestTemplate 来为您处理(取消)编组。