JAXB不会生成所有元素类

时间:2011-11-04 13:25:06

标签: java xml jaxb xsd

对于REST服务,我在XML中定义必要的DTO以生成它的JAXB对象。为了生成,我使用Eclipse IDE的内置选项。

问题是类没有按预期生成。鉴于下面的XML Schema文件,我预计会生成3个类。 ImageTypeImageImages。但是不会生成Image元素的Image类。目前我不知道自己做错了什么。

<?xml version="1.0" encoding="UTF-8"?>
<schema targetNamespace="http://www.company.com/schema/v1/ImageDTO"
    elementFormDefault="qualified" xmlns="http://www.w3.org/2001/XMLSchema"
    xmlns:Q1="http://www.company.com/schema/v1/BusinessObjectDTO"
    xmlns:Q2="http://www.company.com/schema/v1/ImageDTO">

    <import schemaLocation="BusinessObjectDTO.xsd"
        namespace="http://www.company.com/schema/v1/BusinessObjectDTO"></import>

    <complexType name="ImageType" abstract="false">
        <complexContent>
            <extension base="Q1:BusinessObjectType">
                <sequence>
                    <element name="name" type="string" maxOccurs="1" minOccurs="1"></element>
                    <element name="fileName" type="string" maxOccurs="1"
                        minOccurs="1"></element>
                    <element name="thumbnailFileName" type="string" maxOccurs="1"
                        minOccurs="1"></element>
                </sequence>
            </extension>
        </complexContent>
    </complexType>

    <element name="Image" type="Q2:ImageType"></element>

    <element name="Images">
        <complexType>
            <sequence>
                <element name="ImageList" type="Q2:ImageType" maxOccurs="unbounded"
                    minOccurs="0"></element>
            </sequence>
        </complexType>
    </element>
</schema> 

3 个答案:

答案 0 :(得分:4)

您已将Image定义为ImageType类型的元素。因此,Image只是该类型使用的名称。 ImageType定义将转换为Java类,并且当架构中的某个地方引用Image元素时,会导致类型为ImageType的字段注释为XML名为Image的元素。

所以说你有......

<element ref="Image" minOccurs="1" maxOccurs="1" />

在类型定义中的某个地方,导致......

@XmlElement(name="Image" ...)
ImageType image;

...在相应的班级。

Images确实获得类定义的原因是因为您已将其定义为complexType内联。 Image指的是一个类型,因此它们只是使用相应的类。 Images具有匿名类型定义,因此必须生成一个类来捕获其结构。

答案 1 :(得分:2)

如果要生成Image类,Image必须是复杂类型,而不是Q2类型:ImageType。

答案 2 :(得分:2)

如果您确实需要Image类,可以使用以下声明强制生成它:

<element name="Image">
    <complexType>
        <complexContent>
            <extension base="ImageType"/>
        </complexContent>
    </complexType>
</element>
相关问题