3

Jaxbを使用してJavaクラスを生成しています。私のスキーマには次の要素が定義されています。

<xs:complexType name="AutomobileType" abstract="true">
    <xs:sequence>
        <xs:element name="Color" type="core:ColorName"/>
        <xs:element name="Weight" type="core:PoundsWeightType"/>
        <xs:element name="Fuel" type="Fuel"/>
        <xs:element name="NumDoors" type="xs:nonNegativeInteger"/>
        <xs:element name="NumCylinders">
            <xs:simpleType>
                <xs:restriction base="xs:int">
                    <xs:minInclusive value="1"/>
                    <xs:maxInclusive value="12"/>
                </xs:restriction>
            </xs:simpleType>
        </xs:element>
    </xs:sequence>
</xs:complexType>    
<xs:element name="Automobile" type="AutomobileType"/>

ご覧のとおり、Automobileという要素が1つあります。

Jaxbは、Automobileのインスタンスを作成するために使用するクラスとObjectFactoryを作成します。私を困惑させるのは、自動車のインスタンスを作成する方法は次のとおりです。

public JAXBElement<AutomobileType> createAutomobile(AutomobileType value)

createAutomobileメソッドに引数があるのはなぜですか?この方法を使用するにはどうすればよいですか?

私は次のことを試しました:

ObjectFactory objectFactory = new ObjectFactory();
objectFactory.createAutomobile(new Automobile());

ただし、 Automobileクラスは抽象であり、インスタンスを作成できないため、これはコンパイルされません。

4

1 に答える 1

2

別の方法があります:

 public AutomobileType createAutomobileType();

JAXBでは、xsd:complexType"AutomobileType"コンストラクトは同じ名前のクラスをマップします。これは、そのXMLスキーマタイプと同等のデータ構造であることが意図されています。

JAXBElement <>は、Javaオブジェクトと要素名および名前空間を関連付ける(パラメーター化された)ラッパー型です。そのため、そのコンストラクターは、要素の名前空間と要素名に加えて、コンストラクターのパラメーターとしてAutomobileTypeオブジェクトを取ります。生成されたObjectFactory「createAutomobile(..)」は、そのコンストラクターをラップし、XMLスキーマから名前空間と要素名をハードコーディングするための便利なメソッドです。

この二分法は最初はすべて単純ではありませんが、別の名前で別の要素を持つことができると考えてください

これらは構造的には同等ですが、要素名は異なります。別のObjectFactoryメソッド「createMotorcycle(...)」があります。

xml要素のコンテンツを構築する目的で名前のないautomobileTypeオブジェクトを作成し、それをどのXML要素として表すかをJAXBに正確に伝えることができます。

このトピックに関するJAXBドキュメントを十分に読むことはお勧めできません。

于 2013-01-19T06:38:39.467 に答える