为什么有时JAXB映射到JAXBElement?
在非官方指南中有一个占位符答案,带有指向(对我而言)似乎无关的文章的链接。
我使用XJC生成我的JAXB类,尽管它们大多数按预期相互映射,但有些元素被映射到JAXBElement<Foo>
。这对于带有循环的图最令人讨厌,其中有时Foo元素的父节点将是JAXBElement<Foo>
,而它本身没有父属性,从而中断了循环。
我可以想到各种解决方法,但是如果有人可以向我解释这种行为,那就更好了。为什么JAXB有时将<Foo>
元素映射到JAXBElement<Foo>
而不是Foo?
回答:
在对象模型中没有足够信息的用例中,使用JAXBElement保留元素名称/命名空间。最常见的情况是取代基:
<?xml version="1.0" encoding="UTF-8"?><xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org"
xmlns="http://www.example.org"
elementFormDefault="qualified">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element ref="anElement"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="anElement" type="xs:string"/>
<xs:element name="aSubstituteElement" type="xs:string" substitutionGroup="anElement"/>
</xs:schema>
将产生:
package org.example;import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"anElement"
})
@XmlRootElement(name = "root")
public class Root {
@XmlElementRef(name = "anElement", namespace = "http://www.example.org", type = JAXBElement.class)
protected JAXBElement<String> anElement;
public JAXBElement<String> getAnElement() {
return anElement;
}
public void setAnElement(JAXBElement<String> value) {
this.anElement = ((JAXBElement<String> ) value);
}
}
如果删除替换组:
<?xml version="1.0" encoding="UTF-8"?><xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org"
xmlns="http://www.example.org"
elementFormDefault="qualified">
<xs:element name="root">
<xs:complexType>
<xs:sequence>
<xs:element ref="anElement"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="anElement" type="xs:string"/>
</xs:schema>
将生成以下类:
package org.example;import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"anElement"
})
@XmlRootElement(name = "root")
public class Root {
@XmlElement(required = true)
protected String anElement;
public String getAnElement() {
return anElement;
}
public void setAnElement(String value) {
this.anElement = value;
}
}
解组时还可能会得到一个JAXBElement,请比较以下示例:
- 没有任何JAXB元数据,结果将包装在JAXBElement中
- 使用@XmlRootElement消除了根级别JAXBElement
以上是 为什么有时JAXB映射到JAXBElement? 的全部内容, 来源链接: utcz.com/qa/412280.html