アノテーション型 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 アノテーションを付ける必要があります。
    • このアノテーションは、XmlElementWrapperXmlJavaTypeAdapter のアノテーションとともに使用できます。

    追加の共通情報については、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 of type()is
             //  JAXBElement.class , which indicates the XML
             //  element name ObjectFactory - in general a class marked
             //  with @XmlRegistry. (See ObjectFactory below)
             //
             //  The name() is "operator", a pointer to a
             // factory method annotated with a
             //  XmlElementDecl with 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
    • オプション要素のサマリー

      オプション要素  
      修飾子と型 オプションの要素 説明
      StringSEname
      StringSEnamespace
      このパラメーターと name() は、JavaBean プロパティの XML 要素を判別するために使用されます。
      booleanrequired
      必要に応じて要素宣言をカスタマイズします。
      ClassSE<?>type
      参照されている Java 型。
    • 要素の詳細

      • 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 でない場合、この値は "" でなければなりません。

        デフォルト:
        ""
      • 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