将 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 注释则表示使用取自 JAXBElement 实例的元素名称,而不是从 JavaBean 属性名称中派生一个 XML 元素名称。
JAXBElement
,则 @XmlElementRef}.name() 和 @XmlElementRef.namespace() 必须指向一个元素工厂方法,并在使用 @XmlRegistry 注释的类中存在一个 @XmlElementDecl 注释(通常 ObjectFactory 类由模式编译器生成):
JAXBElement
,则由属性或字段引用的类型必须是使用 XmlRootElement
注释的。XmlElementWrapper
和 XmlJavaTypeAdapter
。有关其他公共信息,请参阅 javax.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
可选元素摘要 | |
---|---|
String |
name |
String |
namespace 可以使用此参数和 name() 来确定 JavaBean 属性的 XML 元素。 |
Class |
type 被引用的 Java 类型。 |
public abstract Class type
如果该值为 DEFAULT.class,则可以从 JavaBean 属性类型推导出该类型。
public abstract String namespace
name()
来确定 JavaBean 属性的 XML 元素。
如果 type() 是 JAXBElement.class,那么 namespace() 和 name() 指向带有 XmlElementDecl
的工厂方法。XML 元素名称是工厂方法的 XmlElementDecl
注释的元素名称,如果取自其替换组中的元素(替换组的头元素)在 XML 文档中已被替换,则 XML 元素名称取自替换元素的 XmlElementDecl
。
如果 type()
不是 JAXBElement.class,那么 XML 元素名称是与使用该类型上的 XmlRootElement
注释的类型静态关联的 XML 元素名称。如果没有使用 XmlElementDecl
注释该类型,那么它是一个错误。
如果 type() 不是 JAXBElement.class,那么此值必须是 ""。
public abstract String name
namespace()