JAXB没有创建成员变量和getter和setter

时间:2013-07-31 19:32:57

标签: java xml jaxb xsd

我正在尝试从xsd架构生成Java类,我正在使用JAXB。在大多数情况下,当我运行流程来生成类时,它可以工作。但是,有一些类不会生成成员变量,getter和setter。这就是我所拥有的

文件ns2.xsd

<xs:element name="Observation" type="ns2:ObservationType" substitutionGroup="ns1:_MetaData"/>
<xs:complexType name="ObservationType" mixed="true">
    <xs:complexContent mixed="true">
        <xs:extension base="ns1:AbstractType">
            <xs:sequence>
                    <xs:element ref="ns2:identifier"/>

            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

文件ns3.xsd

<xs:element name="Observation" type="ns3:ObservationType" substitutionGroup="ns2:Observation"/>
<xs:complexType name="ObservationType" mixed="true">
    <xs:annotation>
        <xs:documentation>this extends the ns2:ObservationType </xs:documentation>
    </xs:annotation>
    <xs:complexContent mixed="true">
        <xs:extension base="ns2:ObservationType">
            <xs:sequence>
                <xs:element ref="ns3:deliveryInfo" minOccurs="0"/>
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

这会创建一个空类

package mypackage.ns3;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;


/**
 * this extends the ns2:ObservationType 
 * 
 * <p>Java class for ObservationType complex type.
 * 
 * <p>The following schema fragment specifies the expected content contained within this class.
 * 
 * <pre>
 * &lt;complexType name="ObservationType">
 *   &lt;complexContent>
 *     &lt;extension base="{http://earth.esa.int/ns2}ObservationType">
 *       &lt;sequence>
 *         &lt;element ref="{http://earth.esa.int/ns3}deliveryInfo" minOccurs="0"/>
 *       &lt;/sequence>
 *     &lt;/extension>
 *   &lt;/complexContent>
 * &lt;/complexType>
 * </pre>
 * 
 * 
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "ObservationType")
public class ObservationType
    extends mypackage.ns2.ObservationType
{


}

我的问题是为什么不创建必需的成员变量及其setter和getter?架构是否有问题,或者JAXB是否存在限制,以便使用来自不同文件的扩展来创建复杂类型的缺失信息? 先感谢您。您的帮助或意见将不胜感激。

1 个答案:

答案 0 :(得分:2)

这个用例奇怪的是,您在XML Schema中具有混合内容的两种类型之间的继承。我认为这里有一个XJC(可能是规范)错误,正如Puce所建议的那样,您应该在以下链接中输入错误:

XML Schema

<强> schema.xsd

这是一个更简单的XML架构,可以重现同样的问题:

<?xml version="1.0" encoding="UTF-8"?>
<schema 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.org/schema" 
    xmlns:tns="http://www.example.org/schema" 
    elementFormDefault="qualified">

    <complexType name="b" mixed="true">
                 <sequence>
                   <element ref="tns:bb"/>
                </sequence>
    </complexType>


    <complexType name="c">
        <complexContent mixed="true">
            <extension base="tns:b">
                <sequence>
                   <element ref="tns:cc"/>
                </sequence>
            </extension>
        </complexContent>
    </complexType>

    <element name="bb" type="string"/>

    <element name="cc" type="string"/>

</schema>

不正确的Java模型

<强>乙

b类型生成的类很好。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "b", propOrder = {"content"})
@XmlSeeAlso({C.class})
public class B {

    @XmlElementRef(name = "bb", namespace = "http://www.example.org/schema", type = JAXBElement.class)
    @XmlMixed
    protected List<Serializable> content;

    public List<Serializable> getContent() {
        if (content == null) {
            content = new ArrayList<Serializable>();
        }
        return this.content;
    }

}

<强> C

c类型生成的类是错误的,问题是应该是什么?

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "c")
public class C extends B {


}

更好的Java模型? - 选项#1

您可以向C课程添加属性。然后问题归结为混合文本中的哪一个继承自B继承的属性,并且属于C上定义的属性。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "c")
public class C
    extends B
{

    @XmlElementRef(name = "cc", namespace = "http://www.example.org/schema", type = JAXBElement.class)
    @XmlMixed
    protected List<Serializable> content2;

}

更好的Java模型? - 选项#2

您可以在B上扩展属性,以了解c类型的元素引用。这将允许您正确处理bc类型的XML,但允许一些对XML模式无效的文档。

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "b", propOrder = {"content"})
@XmlSeeAlso({C.class})
public class B {

    @XmlElementRefs({
        @XmlElementRef(name = "bb", namespace = "http://www.example.org/schema", type = JAXBElement.class),
        @XmlElementRef(name = "cc", namespace = "http://www.example.org/schema", type = JAXBElement.class)
    })
    @XmlMixed
    protected List<Serializable> content;

    public List<Serializable> getContent() {
        if (content == null) {
            content = new ArrayList<Serializable>();
        }
        return this.content;
    }

}