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

use*_*371 5 java xml xsd jaxb

我试图从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>
Run Code Online (Sandbox Code Playgroud)

文件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>
Run Code Online (Sandbox Code Playgroud)

这会创建一个空类

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
{


}
Run Code Online (Sandbox Code Playgroud)

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

bdo*_*han 2

这个用例的奇怪之处在于,您的 XML 架构中具有混合内容的两种类型之间的继承。我认为这里存在一个 XJC(可能还有规范)错误,按照 Puce 的建议,您应该在以下链接中输入一个错误:

XML模式

架构.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>
Run Code Online (Sandbox Code Playgroud)

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

C

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

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


}
Run Code Online (Sandbox Code Playgroud)

更好的 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;

}
Run Code Online (Sandbox Code Playgroud)

更好的 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;
    }

}
Run Code Online (Sandbox Code Playgroud)