@RetentionSE(valueSE=RUNTIMESE) @TargetSE(valueSE={FIELDSE,METHODSE}) public @interface XmlElementRef
JavaBean プロパティをプロパティの型から派生した XML 要素にマップします。
使用方法
@XmlElementRef
アノテーションは、JavaBean プロパティとともに、または XmlElementRefs
内から使用できます。
このアノテーションは、XML 要素名を JavaBean プロパティに動的に関連付けます。JavaBean プロパティに XmlElement
のアノテーションが付けられている場合、XML 要素名は JavaBean プロパティ名から静的に派生します。ただし、このアノテーションを使用する場合、XML エレメント名は、実行時に JavaBean プロパティの型のインスタンスから派生します。
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 アノテーションを持つ要素ファクトリメソッドを指す必要があります。コンパイラー):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 //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>
XmlElementRefs
public abstract ClassSE type
値が DEFAULT.class の場合、型は JavaBean プロパティの型から推測されます。
public abstract 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
でない場合、この値は "" でなければなりません。
public abstract StringSE name
namespace()
public abstract 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
に設定されています。
Copyright © 2018,2020 Eclipse Foundation.
Use is subject to license terms.