Подтвердить что ты не робот

@XMLRootElement против @XmlType

В чем разница между аннотацией класса с @XMLRootElement и @XMLType. Я комментировал классы с помощью @XMLType, когда структура будет использоваться несколько раз в XML-схеме и @XMLRootElement, когда она будет использоваться только один раз - это лучший подход?

Другой, но связанный с этим вопрос, который я буду здесь включать. Аннотация @XMLType имеет атрибут propOrder, чтобы указать, в каком порядке появляются его элементы - есть ли эквивалент для @XMLRootElement?

Я использую эти аннотации в сочетании с аннотациями JAX-WS для создания веб-сервисов, если это имеет значение.

4b9b3361

Ответ 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 {
    ...
}