構造がXMLスキーマ内で複数回使用される場合は@XMLTypeで、1回だけ使用される場合は@XMLRootElementでクラスに注釈を付けてきましたが、これが最善のアプローチですか?
知っておくべきことの1つは、@XmlRootElement
または@XmlType
注釈は必要ないということです。それらは@Entity
JPAからのものと同等ではありません。注釈なしで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-任意のコンテンツ
@XmlAnyElement
XMLドキュメントのワイルドカードセクションをマップできます。指定する@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 {
...
}