当前位置: 首页 > 知识库问答 >
问题:

Jackson没有将XML元素大写

方宜
2023-03-14

假设我有以下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吗?根元素呢?

共有1个答案

章翔宇
2023-03-14

看起来Jackson没有解析JAXB注释。要解决这个问题,您可以使用注释内观探索者,例如JaxbAnnotation内观探索者

XmlMapper mapper = new XmlMapper();
mapper.setAnnotationIntrospector(new JaxbAnnotationIntrospector(mapper.getTypeFactory()));

String xml = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(costumer);

还要检查JaxbAnnotationIntrospector文档,因为它有一些限制。

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

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应该创建一次,然后重新使用,正如本文所指出的。

 类似资料:
  • 问题内容: 我需要解析一个连续的格式良好的XML元素流,仅向其提供一个已经构造的对象。这些元素没有包含在根元素中,也没有以XML标头开头,例如,但它们都是有效的XML。 使用Java 类是行不通的,因为XML Reader希望从封闭的根元素开始解析格式良好的XML。因此,它只是读取流中的第一个元素(它被视为根元素),而在下一个元素中失败,使用典型 org.xml.sax.SAXParseExcep

  • 在基于jax-rs的REST API项目中,我们使用Jackson jax-rs XML内容提供者来处理XML内容类型。在序列化POJO列表时,我们需要从POJO中的字段动态设置xml元素名称。 默认Jackson序列化XML: 我们的需求是,将type设置为XML元素名。 为了实现这一点,我们以以下方式编写了一个自定义XML序列化程序: 并使用注释添加了序列化程序: 但是,在使用Jackson

  • 主要内容:什么是 XML 元素?,XML 命名规则,最佳命名习惯,XML 元素是可扩展的XML 文档包含 XML 元素。 什么是 XML 元素? XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。 一个元素可以包含: 其他元素 文本 属性 或混合以上所有... <bookstore> <book category="CHILDREN"> <title>Harry Potter</title> <author>J K. Rowling</author> <year>2

  • *notifyelementevicated[name=mycache status=STATUS_ALIVE evertion=false overflowToDisk=true maxEntriesLocalHeap=0 maxEntriesLocalDisk=0 memoryStoreEvictionPolicy=LFU timeToIdleSeconds=0 persistence=LOC

  • 根据这一点,像XML这样的 但是,将Jackson XmlMapper(默认情况下)用于此类类: 给出一个错误: com.fasterxml.jackson.databind.exc.未识别属性异常:未识别字段""(类org.example.jackson.unwrap.TestIt1$根),未标记为可忽略(一个已知属性:"sub"])... 好的,我可以补充一下 除根文本“asdasda”外,我

  • 我需要定义一个XML元素,它没有子元素或任何内容,也没有属性。 这就是我正在做的: 这看起来很好,但我想知道是否有一种方法可以做到这一点,而不必声明复杂类型。另外,如果我的东西有什么问题,请告诉我。 预料到有人可能会好奇我为什么需要这样一个元素:它用于不需要任何参数值的SOAP操作。