2012-07-17 6 views
35

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

私はここに含まれる異なるしかし関連する質問です。 @XMLTypeアノテーションには、その要素がどの順序で表示されるかを指定するpropOrder属性があります。@XMLRootElementと同等のものがありますか?

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

答えて

17

XmlRootElementXmlTypeの違いは、スコープの問題です。このアノテーションは、単にXMLを生成するために使用されるスキーマの作成を指示することに留意してください。 XmlTypeが(匿名または複合型の)ローカル要素を示すために使用されている間

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

XmlRootElementグローバル要素(匿名またはスキーマタイプ)である

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

このようなものが得られます:

17

それは一度だけ使用されるとき 構造は、XMLスキーマ内および@XMLRootElementで複数回 を使用されるとき、私は@XmlTypeでクラスに注釈を付けるしてきた - これが最善のアプローチですか?

注意すべきことは、@XmlRootElementまたは@XmlType注釈が必要でないことです。 JPAの@Entityに相当するものではありません。あなたはどのようなので、これまでの任意の注釈なしJAXB (JSR-222)実装を使用することができます。I以下

@XmlRootElement@XmlTypeは何をすべきかを説明します。


@XmlRootElement

あなたのJAXB実装がのみ処理されているXML要素に基づいてオブジェクトをインスタンス化する必要がございます。 @XmlRootElementアノテーションは、この関連付けを指定する主な手段です。主ルートオブジェクトを指定するために使用されているルートオブジェクト

@XmlRootElementの指定 - クラスは、複数のXML要素次いで@XmlElementDecl注釈が使用されるべきであるinsteat、

ROLE#1に対応する場合に注意してください。これは、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(); 

ROLE#2 - 置換グループ

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

ROLE#3 - あらゆるコンテンツ

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


@XmlType

ROLE#1 - スキーマゲンという名前の複合型に知られている各Javaクラス用に生成され、デフォルトで

JAXBの文脈。 @XmlTypeアノテーションを使用してこのタイプの名前を制御するか、名前を""と指定して匿名複合タイプを生成するように指定できます。

ROLE#2 - 継承とXSI:タイプ

デフォルトJAXBによっては、継承指標としてxsi:type属性を活用しています。この属性の値は、@XmlType注釈で指定した名前と名前空間に対応します。または、クラスに基づいてデフォルト設定されています。

ROLE#3 - あなたは、プロパティの順序を指定するには、@XmlTypeを使用することができます言及したよう注文

プロップ。

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

@XmlTypeでは、デフォルトの代わりにドメインオブジェクトをインスタンス化するために使用することができファクトリクラスおよび/または方法を指定することができますコンストラクタ。


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

いいえ、propOrderは、@XmlTypeアノテーションに属します。複雑な型は順序の指定に責任があるので、これは意味があります。もちろん、これらの注釈を同時に使用できます。

@XmlRootElement 
@XmlType(propOrder={"foo", "bar"} 
public class Root { 
    ... 
} 
関連する問題