@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
используется, чтобы создать экземпляр JAXBElement, содержа имя элемента XML. Присутствие @XmlElementRef аннотации на свойство элемента указывает, что имя элемента от экземпляра JAXBElement используется вместо того, чтобы произойти, имя элемента XML от свойства JavaBean называют.
Использование подвергается следующим ограничениям:
JAXBElement
, тогда @XmlElementRef}.name() и @XmlElementRef.namespace() должны указать на метод фабрики элемента с @XmlElementDecl аннотацией в class, аннотируемом @XmlRegistry (обычно ObjectFactory class, сгенерированный компилятором схемы): JAXBElement
, тогда тип, на который ссылается свойство или поле, должен быть аннотирован XmlRootElement
. XmlElementWrapper
, XmlJavaTypeAdapter
. См. "Спецификацию Пакета" в javax.xml.bind.package javadoc для дополнительной общей информации.
Пример 1: Пример Задачи Муравья
Следующий Java иерархия class моделирует Муравья, создает сценарий. Задача Муравья соответствует class в иерархии class. Имя элемента XML задачи Муравья обозначается @XmlRootElement аннотацией на ее соответствующий class.@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>
Это не ошибка иметь class, который расширяет Task, который не имеет XmlRootElement
. Но они не могут обнаружиться в экземпляре XML (потому что у них нет имен элементов XML).
Пример 2: XML-схема групповая поддержка Susbstitution
Следующий пример показывает аннотации для групп замены 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
Модификатор и Тип | Дополнительный Элемент и Описание |
---|---|
Строка |
имя |
Строка |
пространство имен
Этот параметр и
name() используются, чтобы определить элемент XML для свойства JavaBean. |
boolean |
необходимый
Настройте объявление элемента, которое будет требоваться.
|
Класс |
ввести
Ссылаемый тип Java.
|
public abstract Class type
Если значением является Значение по умолчанию class, тип выводится из тип свойства JavaBean.
public abstract String namespace
name()
используются, чтобы определить элемент XML для свойства JavaBean. Если type() является JAXBElement.class, то namespace() и name() указывают на метод фабрики с XmlElementDecl
. Имя элемента XML является именем элемента от метода фабрики XmlElementDecl
аннотация или если элементом от его группы замены (из которых это - главный элемент) заменили в XML-документе, тогда имя элемента, от XmlElementDecl
на элементе, которым заменяют.
Если type()
не JAXBElement.class, тогда имя элемента XML является именем элемента XML, статически связанным с типом, используя аннотацию XmlRootElement
на типе. Если тип не аннотируется XmlElementDecl
, тогда это - ошибка.
Если type() не является JAXBElement.class, то это значение должно быть "".
public abstract String name
namespace()
public abstract boolean required
Если требующийся () истина, то свойство Javabean отображается на объявление элемента XML-схемы с minOccurs = "1". maxOccurs "1" для единственного свойства, передаваемого по значению, и "неограничен" для многозначного свойства.
Если требующийся () ложь, то свойство Javabean отображается на объявление элемента XML-схемы с minOccurs = "0". maxOccurs "1" для единственного свойства, передаваемого по значению, и "неограничен" для многозначного свойства.
Для совместимости с JAXB 2.1, это свойство значения по умолчанию к true, несмотря на то, что XmlElement.required()
значения по умолчанию ко лжи.
Для дальнейшей ссылки API и документации разработчика, см. Java Документация SE. Та документация содержит более подробные, предназначенные разработчиком описания, с концептуальными краткими обзорами, определениями сроков, обходных решений, и рабочих примеров кода.
Авторское право © 1993, 2013, Oracle и/или его филиалы. Все права защищены.
Проект сборка-b92