首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XmlMapper将XmlProperty反序列化为XmlElement

XmlMapper将XmlProperty反序列化为XmlElement
EN

Stack Overflow用户
提问于 2021-08-18 11:49:43
回答 1查看 343关注 0票数 1

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

我有以下课程:

代码语言:javascript
复制
@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配置:

代码语言:javascript
复制
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);

与受抚养人:

代码语言:javascript
复制
<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.10.3</version>
</dependency>

我希望结果是:

代码语言:javascript
复制
<header>
    <createdOn value="2021-08-18T14:06:14.493+03:00"/>
</header>

但结果是:

代码语言:javascript
复制
  <header>
    <createdOn>
      <value>2021-08-18T14:06:14.493+03:00</value>
    </createdOn>
  </header>

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-18 12:20:05

在使用JAXB注释作为元数据时,需要指示Jackson使用这些元数据。否则,它将使用缺省值,用于XML的Jackson注释,或者当不在时,所有东西都将成为一个元素。

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

代码语言:javascript
复制
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,它为您处理(Un)编组。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68831792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档