42

@XMLRootElementとでクラスに注釈を付けるの違いは何ですか@XMLType@XMLTypeXMLスキーマ内で構造が複数回使用される場合と、一度だけ使用される場合でクラスに注釈を付けてきましたが@XMLRootElement、これが最善の方法ですか?

ここに含める別の関連する質問。注釈には、その@XMLType要素が表示される順序を指定する propOrder 属性があります - に相当するものはあり@XMLRootElementますか?

これらのアノテーションを JAX-WS アノテーションと組み合わせて使用​​して、違いがあれば Web サービスを作成しています。

4

2 に答える 2

23

XmlRootElementとの違いXmlTypeはスコープの問題です。この注釈は、XML の生成に使用されるスキーマの作成を指示しているだけであることを忘れないでください。はXmlRootElement、グローバル要素 (匿名またはスキーマ タイプ) を示します。

<xs:element name=foo type="bar"> </xs:element> <-- schema type

XmlType、ローカル要素 (匿名型または複合型) を示すために使用されます。

<xs:complexType name=bar> </xs:complexType> <-- complex type

ここでのローカル/グローバルの主な違いは、オブジェクトが表示されるスキーマの階層と、スキーマ型または複合型のどちらを宣言しているかです。これらの注釈の両方のドキュメントはよく書かれており、例が含まれています。

XmlRootElement

XmlType

EDIT:propOrder質問への対処:ローカルタイプも宣言している場合は、グローバル要素で使用できます:

@XmlRootElement (name="PersonElement")
@XmlType (propOrder={"firstname", "lastname"})
public class People{
    @XmlElement
    public String firstname;
    public String lastname;
}

これにより、次のような結果が得られます。

<xs:element name="PersonElement" type="People"/>
<xs:complexType name="People">
    <xs:sequence>
        <xs:element name="firstname" type="xs:string"/>
        <xs:element name="lastname" type="xs:string"/>
    </xs:sequence>
</xs:complexType>
于 2012-07-17T13:59:34.550 に答える
17

構造がXMLスキーマ内で複数回使用される場合は@XMLTypeで、1回だけ使用される場合は@XMLRootElementでクラスに注釈を付けてきましたが、これが最善のアプローチですか?

知っておくべきことの1つは、@XmlRootElementまたは@XmlType注釈は必要ないということです。それらは@EntityJPAからのものと同等ではありません。注釈なしでJAXB(JSR-222)実装を使用できます。

以下に、何をして何@XmlRootElementをするかを説明し@XmlTypeます。


@XmlRootElement

JAXB実装では、処理中のXML要素のみに基づいてオブジェクトをインスタンス化する必要がある場合があります。@XmlRootElement注釈は、この関連付けを指定するための主要な手段です。クラスが複数のXML要素に対応する場合は、@XmlElementDeclアノテーションをそのまま使用する必要があることに注意してください。

ロール#1-ルートオブジェクトの指定

@XmlRootElement主にルートオブジェクトを指定するために使用されます。これは、JAXB実装がXMLドキュメントの非マーシャリングを開始するときに、インスタンス化するオブジェクトを認識しているためです。以降のほとんどすべてのアノテーションは、親クラスから収集された情報に基づいています。

フー

@XmlRootElement(name="root")
public class Foo {

    private String name;

}

バー

public class Bar {

    private String name;

}

XML

<root>
    <name>Jane Doe</name>
</root>

デモ

Foo foo = (Foo) unmarshaller.unmarshal(xml);
Bar bar = unmarshaller.unmarshal(xml, Bar.class).getValue();

役割#2-代替グループ

アノテーションは@XmlElementRef、インスタンス化されたオブジェクトのタイプを要素の名前/URIに委任します。これにより、継承を表すための置換グループの概念へのマッピングが可能になります。

役割#3-任意のコンテンツ

@XmlAnyElementXMLドキュメントのワイルドカードセクションをマップできます。指定する@XmlAnyElement(lax=true)と、ドメインオブジェクトに関連付けられた要素が対応するドメインオブジェクトに変換されます。


@XmlType

役割#1-スキーマ生成

デフォルトでは、JAXBコンテキストで認識されているJavaクラスごとに名前付き複合型が生成されます。アノテーションを使用してこのタイプの名前を制御する@XmlTypeか、名前をとして指定して匿名の複合型を生成するように指定できます""

役割#2-継承とxsi:type

デフォルトでは、JAXBはxsi:type属性を継承インジケーターとして利用します。この属性の値は、@XmlTypeアノテーションで指定した名前と名前空間に対応するか、クラスに基づいてデフォルト設定されます。

役割#3-小道具の注文

おっしゃるように、を使用し@XmlTypeてプロパティの順序を指定できます。

ロール#4-ファクトリメソッド

@XmlTypeデフォルトのコンストラクターの代わりにドメインオブジェクトをインスタンス化するために使用できるファクトリクラスやメソッドを指定できます。


ここに含める、別の関連する質問。@XMLTypeアノテーションには、要素が表示される順序を指定するpropOrder属性があります-@XMLRootElementに相当するものはありますか?

いいえ、アスペクトはアノテーションpropOrderに属しています。@XmlType複合型は順序(または順序の欠如)を指定する責任があるため、これは理にかなっています。もちろん、これらの注釈を同時に使用することもできます。

@XmlRootElement
@XmlType(propOrder={"foo", "bar"}
public class Root {
    ...
}
于 2012-07-17T15:57:28.590 に答える