|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
| 上一個類別 下一個類別 | 框架 無框架 | |||||||||
| 摘要: 必需 | 可選 | 詳細資訊: 元素 | |||||||||
@Retention(value=RUNTIME)
@Target(value={FIELD,METHOD})
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 註釋則表示使用取自 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 輸出:
.... ....
有一個類別擴展了不具有 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>
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()
|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
| 上一個類別 下一個類別 | 框架 無框架 | |||||||||
| 摘要: 必需 | 可選 | 詳細資訊: 元素 | |||||||||
版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only。