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
来为您处理(取消)编组。
我正在编写一个需要使用 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
来为您处理(取消)编组。