假设我有以下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吗?根元素呢?
看起来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操作。