Почему проверяется аннотация @XmlRootElement
Spring требует корневого элемента при маршалинге объекта в XML.JAXB предоставляет два механизма для этого:
- Аннотация @XmlRootElement
- Заключение корневого объекта в экземпляр JAXBElement.
Поскольку объект являетсяне завернутый в JAXBElement Spring обеспечивает выполнение другого условия.
Как создать @ XmlRootElement
JAXB сгенерирует аннотацию @XmlRootElement для всех глобальных элементов вXML-схема.Следующее действие вызовет @XmlElement:
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="foo">
<xsd:complexType>
...
</xsd:complextType>
</xsd:element>
</xsd:schema>
Когда @XmlRootElement не генерируется
Аннотация @XmlRootElement не будет сгенерирована для глобальных типов.
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="foo" type="foo"/>
<xsd:complexType name="foo">
...
</xsd:complexType>
</xsd:schema>
Вместо этого глобальные элементы, связанные с глобальными типами, регистрируются в классе ObjectFactory (аннотированном @XmlRegistry) в форме аннотаций @XmlElementDecl.Эти аннотации
package generated;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.XmlElementDecl;
import javax.xml.bind.annotation.XmlRegistry;
import javax.xml.namespace.QName;
@XmlRegistry
public class ObjectFactory {
private final static QName _Foo_QNAME = new QName("", "foo");
public Foo createFoo() {
return new Foo();
}
@XmlElementDecl(namespace = "", name = "foo")
public JAXBElement<Foo> createFoo(Foo value) {
return new JAXBElement<Foo>(_Foo_QNAME, Foo.class, null, value);
}
}
Аннотация @XmlElementDecl предоставляет информацию, аналогичную @XmlRootElement, и может использоваться для операций демаршала.Однако реализации JAX-RS, вероятно, не используют @XmlElementDecl, поскольку маршальные операции требуют, чтобы объект был обернут в объект JAXBElement для предоставления имени / пространства имен корневого элемента.