@XMLRootElement против @XmlType
В чем разница между аннотацией класса с @XMLRootElement
и @XMLType
. Я комментировал классы с помощью @XMLType
, когда структура будет использоваться несколько раз в XML-схеме и @XMLRootElement
, когда она будет использоваться только один раз - это лучший подход?
Другой, но связанный с этим вопрос, который я буду здесь включать. Аннотация @XMLType
имеет атрибут propOrder, чтобы указать, в каком порядке появляются его элементы - есть ли эквивалент для @XMLRootElement
?
Я использую эти аннотации в сочетании с аннотациями JAX-WS для создания веб-сервисов, если это имеет значение.
Ответы
Ответ 1
Разница между XmlRootElement
и XmlType
является предметом обзора. Помните, что это аннотация просто диктует создание схемы, используемой для генерации вашего XML. XmlRootElement
обозначает глобальный элемент (с анонимным или тип схемы):
<xs:element name=foo type="bar"> </xs:element> <-- schema type
а XmlType
используется для обозначения локального элемента (с анонимным или сложным типом):
<xs:complexType name=bar> </xs:complexType> <-- complex type
Основные отличия локального/глобального здесь находятся в иерархии схемы, в которой будет отображаться ваш объект, и объявляете ли вы тип схемы или сложный тип. Документация для обеих этих аннотаций хорошо написана и включает примеры:
XmlRootElement
XmlType
EDIT: обращение к вопросу propOrder
: вы можете использовать его в глобальном элементе, если вы также объявляете локальный тип:
@XmlRootElement (name="PersonElement")
@XmlType (propOrder={"firstname", "lastname"})
public class People{
@XmlElement
public String firstname;
public String lastname;
}
Это даст что-то вроде:
<xs:element name="PersonElement" type="People"/>
<xs:complexType name="People">
<xs:sequence>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
</xs:sequence>
</xs:complexType>
Ответ 2
Я писал аннотации классов с @XMLType, когда структура будет используется не один раз в XML-схеме и @XMLRootElement, когда он будет использоваться только один раз - это лучший подход?
Следует знать, что не требуется аннотация @XmlRootElement
или @XmlType
. Они не эквивалентны @Entity
из JPA. Вы можете использовать JAXB (JSR-222) без каких-либо аннотаций, что так всегда:
Ниже я объясню, что делать @XmlRootElement
и @XmlType
.
@XmlRootElement
Бывают случаи, когда ваша реализация JAXB должна создавать экземпляр объекта, основанного только на обрабатываемом элементе XML. Аннотация @XmlRootElement
является основным средством указания этой ассоциации. Обратите внимание, если класс соответствует более чем одному элементу XML, тогда следует использовать аннотацию @XmlElementDecl
,
ROLE # 1 - Указание корневого объекта
@XmlRootElement
в основном используется для указания корневого объекта. Это так, когда ваша реализация JAXB начинает развязывать XML-документ, он знает, какой объект для создания экземпляра. Почти все последующие аннотации будут основаны на информации, собранной из родительского класса.
Foo
@XmlRootElement(name="root")
public class Foo {
private String name;
}
Bar
public class Bar {
private String name;
}
XML
<root>
<name>Jane Doe</name>
</root>
Demo
Foo foo = (Foo) unmarshaller.unmarshal(xml);
Bar bar = unmarshaller.unmarshal(xml, Bar.class).getValue();
ROLE # 2 - Группы замещения
Аннотация @XmlElementRef
делегирует тип объекта, созданного для имени /uri элемента. Это позволяет отображать понятие групп подстановок для представления наследования.
ROLE # 3 - любой контент
@XmlAnyElement
позволяет вам сопоставить раздел дикой карты вашего XML-документа. Если вы укажете @XmlAnyElement(lax=true)
, тогда элементы, связанные с объектами домена, будут преобразованы в соответствующий объект домена.
@XmlType
РОЛЬ # 1 - Генератор схемы
По умолчанию для каждого класса Java, известного контексту JAXB, генерируется именованный сложный тип. Вы можете управлять именем этого типа с помощью аннотации @XmlType
или указать, что анонимный сложный тип должен быть сгенерирован, указав имя как ""
.
ROLE # 2 - Наследование и xsi: type
По умолчанию JAXB использует атрибут xsi:type
как индикатор наследования. Значение этого атрибута соответствует имени и пространству имен, указанному в аннотации @XmlType
, или по умолчанию используется на основе класса.
РОЛЬ № 3 - Заказ ордера
Как вы упомянули, вы можете использовать @XmlType
для указания порядка свойств.
ROLE # 4 - Factory Методы
@XmlType
позволяет указать класс и/или метод Factory, который может использоваться для создания экземпляра объекта домена вместо конструктора по умолчанию.
Другой, но связанный с этим вопрос, который я буду здесь включать. @XMLType аннотация имеет атрибут propOrder, чтобы указать, в каком порядке он появляются элементы - есть ли эквивалент для элемента @XMLRootElement?
Нет, аспект propOrder
принадлежит аннотации @XmlType
. Это имеет смысл, поскольку сложные типы несут ответственность за указание (или отсутствие) порядка. Вы можете, конечно, использовать эти аннотации в то же время.
@XmlRootElement
@XmlType(propOrder={"foo", "bar"}
public class Root {
...
}