JAXB为子类型中的固定属性生成了类

时间:2013-09-28 18:39:58

标签: java binding jaxb xsd generated-code

我的java类是从xsd文件生成的 我想要实现的目标是让一些人知道"基于元素类型的属性。例如,我有一份动物清单。在解析xml之后,我想在代码中知道我的动物有多少腿。但是腿的数量是动物类型的特征,因此,如果我有一只猫,它将有4条腿,而袋鼠将有2条腿。
如果我像这样定义xsd:

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

    <xs:element name="Animals" type="animals" />

    <xs:complexType name="animals">
        <xs:sequence>
            <xs:element name="Animal" maxOccurs="unbounded"  type="animal"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="animal" abstract="true">
        <xs:simpleContent>
            <xs:extension base="xs:string">
             <xs:attribute name="name" />
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <xs:complexType name="catType">
        <xs:simpleContent>
            <xs:extension base="animal">
                <xs:attribute name="nbOfLegs" type="xs:integer" fixed="4" />
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <xs:complexType name="kangarooType">
        <xs:simpleContent>
            <xs:extension base="animal">
                <xs:attribute name="nbOfLegs" type="xs:integer" fixed="2" />
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

</xs:schema>

生成的类符合预期(我删除了注释):

public abstract class Animal {
    protected String name;
    public String getName() {return name;}
    public void setName(String value) {this.name = value;}
}

public class CatType extends Animal {
    protected BigInteger nbOfLegs;
    public BigInteger getNbOfLegs() {
        if (nbOfLegs == null) {
            return new BigInteger("4");
        } else {
            return nbOfLegs;
        }
    }
    public void setNbOfLegs(BigInteger value) {this.nbOfLegs = value;}
}

这样,如果用户在xml中设置了猫的腿数,它只能是4,如果他没有,在代码中我仍会收到4。与袋鼠类似,我总是收到两条腿 但是这种方法的问题在于我不能像这样使用多态性:

for(Animal animal : animals) {
    System.out.println(animal.getNbOfLegs());
}

所以我尝试了另一种方法:

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

    <xs:element name="Animals" type="animals" />

    <xs:complexType name="animals">
        <xs:sequence>
            <xs:element name="Animal" maxOccurs="unbounded"  type="animal"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="animal" abstract="true">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="name" />
                <xs:attribute name="nbOfLegs" type="xs:integer"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <xs:complexType name="catType">
        <xs:simpleContent>
            <xs:restriction base="animal">
                <xs:attribute name="nbOfLegs" type="xs:integer" fixed="4" />
            </xs:restriction>
        </xs:simpleContent>
    </xs:complexType>

    <xs:complexType name="kangarooType">
        <xs:simpleContent>
            <xs:restriction base="animal">
                <xs:attribute name="nbOfLegs" type="xs:integer" fixed="2" />
            </xs:restriction>
        </xs:simpleContent>
    </xs:complexType>

</xs:schema>

Animal类按预期生成:

public abstract class Animal {  
    protected String name;
    protected BigInteger nbOfLegs;
    public String getName() {return name;}
    public void setName(String value) {this.name = value;}
    public BigInteger getNbOfLegs() {return nbOfLegs;}
    public void setNbOfLegs(BigInteger value) {this.nbOfLegs = value;}
}

但生成的CatType 为空 我希望它是这样的:

public class CatType extends Animal {
    @Override
    public BigInteger getNbOfLegs() {
        if (nbOfLegs == null) {
            return new BigInteger("4");
        } else {
            return nbOfLegs;
        }
    }
}

是否可以自定义绑定文件以实现所需的生成CatType类?
谢谢。

0 个答案:

没有答案