在非官方指南中有一个占位符答案,带有指向(对我而言)似乎无关的文章的链接。
我使用XJC生成我的JAXB类,尽管它们大多数按预期相互映射,但有些元素被映射到JAXBElement<Foo>。这对于带有循环的图最令人讨厌,其中有时Foo元素的父节点将是JAXBElement<Foo>,而它本身没有父属性,从而中断了循环。
JAXBElement<Foo>
我可以想到各种解决方法,但是如果有人可以向我解释这种行为,那就更好了。为什么JAXB有时将<Foo>元素映射到JAXBElement<Foo>而不是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,请比较以下示例: