【问题标题】:Jackson not capitalizing XML elements杰克逊没有大写 XML 元素
【发布时间】:2020-01-14 06:10:33
【问题描述】:

假设我有以下 XML 模型:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
        "person",
        "user"
})
@XmlRootElement(name = "CUSTOMER")
public class CUSTOMER {
    @XmlElement(name = "PERSON", required = true)
    protected CUSTOMER.PERSON person;
    @XmlElement(name = "USER", required = true)
    protected CUSTOMER.USER user;
 ....
 ....

如果我按照以下约定重命名类:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
        "person",
        "user"
})
@XmlRootElement(name = "CUSTOMER")
public class Customer {
....

这两个元素都像:

    @XmlElement(name = "PERSON", required = true)
    protected CUSTOMER.PERSON person;
    @XmlElement(name = "USER", required = true)
    protected CUSTOMER.USER user;
    ....

XML 来自

new XmlMapper().writerWithDefaultPrettyPrinter().writeValueAsString(customer)) 

看起来像这样:

<Customer>
  <id>id</id>
  ...
  <person>
    <id>id</id>
    ...
  </person>
  <user>
    <id>id</id>
    ...
  </user>
</Customer>

但我希望它看起来像这样:

<CUSTOMER>
  <id>id</id>
  ...
  <PERSON>
    <id>id</id>
    ...
  </PERSON>
  <USER>
    <id>id</id>
    ...
  </USER>
</CUSTOMER>

我做错了吗? 我看到我可以使用 @JsonProperty 并且它有效,但仅适用于字段,我觉得在 XML 元素上使用 JsonProperty 是错误的。 我的模型类可以命名为 CUSTOMER、PERSON、USER 还是我应该重命名它们,如果重命名它们更好,我应该使用 JsonProperty? RootElement 呢?

【问题讨论】:

    标签: java xml jackson


    【解决方案1】:

    看起来 Jackson 没有解析 JAXB 注释。要修复它,您可以使用注解内省器,例如 JaxbAnnotationIntrospector

    XmlMapper mapper = new XmlMapper();
    mapper.setAnnotationIntrospector(new JaxbAnnotationIntrospector(mapper.getTypeFactory()));
    
    String xml = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(costumer);
    

    还要查看JaxbAnnotationIntrospector 文档,因为存在一些限制。


    如果出于某种原因,您打算直接使用 JAXB,正如您在 cmets 中提到的那样,您将有类似的内容:

    JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class);
    Marshaller marshaller = jaxbContext.createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    
    StringWriter writer = new StringWriter();
    marshaller.marshal(customer, writer);
    
    String xml = writer.toString();
    

    请记住,JAXBContext 应该创建一次,然后重复使用,正如 answer 中所指出的那样。

    【讨论】:

    • 这行得通,我可以使用 JAXB 中的 XmlMapper 等价物来代替改装 XmlMapper 吗?
    • @D.Tomov 我不确定我是否在关注您的评论。那你为什么不直接使用JAXB呢?
    • 我正在寻找一种将这些对象与 RestTemplate 一起使用的方法。是否有一种将对象转换为字符串的 JAXB 方法。我不熟悉 JAXB。这是一个生成的类。
    • @D.Tomov 我已经用一个关于如何使用 JAXB 的示例更新了我的答案,但我需要更多的上下文来给你一个更详细的答案。您随时可以ask a new question 并提供有关您如何使用RestTemplate 的更多详细信息。
    • 谢谢你的回答如果我能上传两次我会的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 2020-08-10
    相关资源
    最近更新 更多