アノテーション型 XmlElementRef
@RetentionSE(RUNTIMESE) @TargetSE({FIELDSE,METHODSE}) public @interface XmlElementRef
JavaBean プロパティをプロパティの型から派生した XML 要素にマップします。
使用方法
@XmlElementRefアノテーションは、JavaBean プロパティとともに、またはXmlElementRefs内から使用できます。このアノテーションは、XML 要素名を JavaBean プロパティに動的に関連付けます。JavaBean プロパティに
XmlElementのアノテーションが付けられている場合、XML 要素名は JavaBean プロパティ名から静的に派生します。ただし、このアノテーションを使用する場合、XML エレメント名は、実行時に JavaBean プロパティの型のインスタンスから派生します。XML スキーマ置換グループのサポート
XML スキーマを使用すると、XML ドキュメントの作成者は、置換グループを使用してスキーマのコンテンツモデルで静的に指定されていない XML 要素名を使用できます。スキーマ派生コードは、 要素プロパティを使用した置換グループのサポートを提供します(セクション 5.5.5、Jakarta XML Binding 仕様の「要素プロパティ」)。要素プロパティメソッドのシグネチャーは次の形式です。public void setTerm(JAXBElement<? extends Operator>); public JAXBElement<? extends Operator> getTerm();XmlElementDeclアノテーションが付けられた要素ファクトリメソッドは、XML 要素名を含むJAXBElementインスタンスを作成するために使用されます。要素プロパティに@XmlElementRefアノテーションが存在することは、JavaBean プロパティ名から XML 要素名を取得する代わりに、JAXBElementインスタンスからの要素名が使用されていることを示します。使用箇所には、次の制約があります。
- コレクションアイテム型(コレクションプロパティの場合)またはプロパティ型(単一値プロパティの場合)が
JAXBElementの場合、@XmlElementRef.name()および@XmlElementRef.namespace()は、@XmlRegistry アノテーションが付けられたクラス(通常はスキーマによって生成された ObjectFactory クラス)内の @XmlElementDecl アノテーションを持つ要素ファクトリメソッドを指す必要があります。コンパイラー):- @XmlElementDecl.name() は @XmlElementRef.name() と等しくなければなりません
- @XmlElementDecl.namespace() は @XmlElementRef.namespace() と等しくなければなりません。
- コレクションアイテム型(コレクションプロパティの場合)またはプロパティ型(単一値プロパティの場合)が
JAXBElementでない場合、プロパティまたはフィールドによって参照される型にはXmlRootElementアノテーションを付ける必要があります。 - このアノテーションは、
XmlElementWrapper、XmlJavaTypeAdapterのアノテーションとともに使用できます。
追加の共通情報については、jakarta.xml.bind.package javadoc の「パッケージ仕様」を参照してください。
例 1: Ant タスクの例
次の Java クラス階層は、Ant ビルドスクリプトをモデル化しています。Ant タスクは、クラス階層内のクラスに対応します。Ant タスクの XML エレメント名は、対応するクラスの @XmlRootElement アノテーションによって示されます。@XmlRootElement(name="target") class Target { // The presence of @XmlElementRef indicates that the XML // element name will be derived from the @XmlRootElement // annotation on the type (for e.g. "jar" for JarTask). @XmlElementRef List<Task> tasks; } abstract class Task { } @XmlRootElement(name="jar") class JarTask extends Task { ... } @XmlRootElement(name="javac") class JavacTask extends Task { ... }<!-- XML Schema fragment --> <xs:element name="target" type="Target"> <xs:complexType name="Target"> <xs:sequence> <xs:choice maxOccurs="unbounded"> <xs:element ref="jar"> <xs:element ref="javac"> </xs:choice> </xs:sequence> </xs:complexType>次のコードフラグメント:
Target target = new Target(); target.tasks.add(new JarTask()); target.tasks.add(new JavacTask()); marshal(target);次の XML 出力を生成します。<target> <jar> .... </jar> <javac> .... </javac> </target>XmlRootElementを持たないTaskを継承するクラスがあることはエラーではありません。ただし、XML インスタンスに表示することはできません(XML 要素名がないため)。例 2: XML スキーマ置換グループのサポート
次の例は、XML スキーマ置換グループのアノテーションを示しています。アノテーションと ObjectFactory はスキーマから派生しています。
@XmlElement class Math { // The value oftype()is // JAXBElement.class , which indicates the XML // element name ObjectFactory - in general a class marked // with @XmlRegistry. (See ObjectFactory below) // // Thename()is "operator", a pointer to a // factory method annotated with a //XmlElementDeclwith the name "operator". Since // "operator" is the head of a substitution group that // contains elements "add" and "sub" elements, "operator" // element can be substituted in an instance document by // elements "add" or "sub". At runtime, JAXBElement // instance contains the element name that has been // substituted in the XML document. // @XmlElementRef(type=JAXBElement.class,name="operator") JAXBElement<? extends Operator> term; } @XmlRegistry class ObjectFactory { @XmlElementDecl(name="operator") JAXBElement<Operator> createOperator(Operator o) {...} @XmlElementDecl(name="add",substitutionHeadName="operator") JAXBElement<Operator> createAdd(Operator o) {...} @XmlElementDecl(name="sub",substitutionHeadName="operator") JAXBElement<Operator> createSub(Operator o) {...} } class Operator { ... }次のコードフラグメント
Math m = new Math(); m.term = new ObjectFactory().createAdd(new Operator()); marshal(m);次の XML 出力を生成します。<math> <add>...</add> </math>- 導入:
- 1.6、JAXB 2.0
- 作成者:
- Kohsuke Kawaguchi, Sun Microsystems,Inc.
- Sekhar Vajjhala, Sun Microsystems, Inc.
- 関連事項:
XmlElementRefs
- コレクションアイテム型(コレクションプロパティの場合)またはプロパティ型(単一値プロパティの場合)が
要素の詳細
type
ClassSE<?> type
参照されている Java 型。値が DEFAULT.class の場合、型は JavaBean プロパティの型から推測されます。
- デフォルト:
- jakarta.xml.bind.annotation.XmlElementRef.DEFAULT.class
namespace
StringSE namespace
このパラメーターとname()は、JavaBean プロパティの XML 要素を判別するために使用されます。type()がJAXBElement.classの場合、namespace()とname()は、XmlElementDeclを使用したファクトリメソッドを指します。XML 要素名は、ファクトリメソッドのXmlElementDeclアノテーションからの要素名です。または、その置換グループ(head 要素)の要素が XML ドキュメントで置換されている場合、要素名は、置換されたXmlElementDeclからのものです。素子。type()がJAXBElement.classでない場合、XML エレメント名は、型のアノテーションXmlRootElementを使用して型に静的に関連付けられた XML エレメント名です。型にXmlElementDeclのアノテーションが付いていない場合は、エラーです。type()がJAXBElement.classでない場合、この値は "" でなければなりません。- デフォルト:
- ""
name
StringSE name
- 関連事項:
namespace()
- デフォルト:
- "##default"
required
boolean required
必要に応じて要素宣言をカスタマイズします。required() が true の場合、Javabean プロパティは minOccurs="1" の XML スキーマ要素宣言にマップされます。maxOccurs は、単一値プロパティの場合は "1"、複数値プロパティの場合は "unbounded" です。
required() が false の場合、Javabean プロパティは minOccurs="0" の XML スキーマ要素宣言にマップされます。maxOccurs は、単一値プロパティの場合は "1"、複数値プロパティの場合は "unbounded" です。
Jakarta XML Binding との互換性のために、
XmlElement.required()がデフォルトで false に設定されているにもかかわらず、このプロパティはデフォルトでtrueに設定されています。- 導入:
- 1.7、JAXB 2.2
- デフォルト:
- true