在the unofficial guide处有一个占位符回答,其中包含一篇文章的链接(对我而言)似乎非常不相关。
我使用XJC生成我的JAXB类,虽然它们中的大多数按预期映射到彼此,但是一些元素被映射到JAXBElement<Foo>
。这对于具有周期的图来说是最烦人的,其中有时Foo元素的父节点将是JAXBElement<Foo>
,它本身不具有父属性,从而打破了循环。
我可以想到各种解决方法,但如果有人能向我解释这种行为会更好。为什么JAXB有时会将<Foo>
元素映射到JAXBElement<Foo>
而不是Foo?
答案 0 :(得分:10)
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,比较以下示例:
答案 1 :(得分:0)
为避免映射到JAXBElement? 我做过这件事对我有用:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
jaxb:extensionBindingPrefixes="xjc"
jaxb:version="2.0">
<xs:annotation>
<xs:appinfo>
<jaxb:globalBindings generateValueClass="false">
<xjc:simple />
</jaxb:globalBindings>
</xs:appinfo>
</xs:annotation>
</xs:schema>
将此文件保存在xml文件中并作为绑定文件提供。
参考Link
使用eclipse生成JAXB类,不要忘记给出使用上面的xml创建的绑定文件,并检查&#34;允许供应商扩展&#34;如下:
通过更改,我可以在生成的xjc类中删除JAXBElement,以便将xsd转换为JAXB生成的类。