@XMLRootElement против @XmlType



0 Answers

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

Одно дело знать, что не @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;

}

Бар

public class Bar {

    private String name;

}

XML

<root>
    <name>Jane Doe</name>
</root>

демонстрация

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

ROLE # 1 - Генератор схем

По умолчанию для каждого класса Java, известного контексту JAXB, генерируется именованный сложный тип. Вы можете управлять этим типом с @XmlType аннотации @XmlType или указать, что анонимный сложный тип должен быть сгенерирован, указав имя как "" .

ROLE # 2 - Наследование и xsi: type

По умолчанию JAXB использует атрибут xsi:type в качестве индикатора наследования. Значение этого атрибута соответствует имени и пространству имен, указанному в аннотации @XmlType , или по умолчанию используется на основе класса.

ROLE # 3 - Заказ ордера

Как вы упомянули, вы можете использовать @XmlType для указания порядка свойств.

ROLE # 4 - заводские методы

@XmlType позволяет указать фабричный класс и / или метод, который может использоваться для создания экземпляра объекта домена вместо конструктора по умолчанию.

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

Нет, аспект propOrder принадлежит аннотации @XmlType . Это имеет смысл, поскольку сложные типы несут ответственность за указание (или отсутствие) порядка. Конечно, вы можете использовать эти аннотации одновременно.

@XmlRootElement
@XmlType(propOrder={"foo", "bar"}
public class Root {
    ...
}
Question

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

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

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




Related