Как работает объявление xx-transient MOXy?
У меня есть набор bean-компонентов в отдельном проекте, которые я не могу изменить. Эти компоненты имеют аннотации JPA и JAXB и используются в реализации RESTful. Большинство моих отношений лениво загружены, и я надеялся добиться более детального контроля над тем, какие элементы фактически собираются для транспортировки.
У меня есть модифицированный класс MOXy Customer.java ниже.
@javax.xml.bind.annotation.XmlType
@javax.xml.bind.annotation.XmlAccessorType(value=javax.xml.bind.annotation.XmlAccessType.PROPERTY)
public class Customer {
private String name;
private Address address;
private List<PhoneNumber> phoneNumbers;
// getters and setters
}
Я надеялся, что смогу использовать отображение MOXy eclipselink-oxm для контроля того, что происходит, но оно не ведет себя так, как я ожидал. Используя аннотации JAXB, вы объявляете элемент (поле или свойство) временным, но eclipselink-oxm.xml допускает только временные объявления для типов. Тем не менее, когда я объявляю тип переходного типа, как это, я получаю следующие исключения:
<?xml version="1.0"?>
<xml-bindings
xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm">
<java-types>
<java-type name="example.gettingstarted.Customer">
<xml-root-element/>
<java-attributes>
<xml-element java-attribute="name" xml-path="personal-info/name/text()"/>
<xml-element java-attribute="address" xml-path="contact-info/address"/>
</java-attributes>
</java-type>
<java-type name="example.gettingstarted.PhoneNumber" xml-transient="true" />
</java-types>
</xml-bindings>
Исключение:
Exception [EclipseLink-110] (Eclipse Persistence Services - 2.1.0.v20100614-r7608): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Descriptor is missing for class [example.gettingstarted.PhoneNumber].
Mapping: org.eclipse.persistence.oxm.mappings.XMLCompositeCollectionMapping[phoneNumbers]
Descriptor: XMLDescriptor(example.gettingstarted.Customer --> [DatabaseTable(customer)])
Если я удалю атрибут xml-transient или установлю его в false, Customer преобразуется в XML, как и ожидалось. Можно ли как-то подавить сортировку телефонных номеров без изменения bean-компонента Customer?
1 ответ
Вы можете указать использовать следующий файл сопоставления, чтобы сделать свойство phoneNumbers для Customer кратковременным:
<?xml version="1.0"?>
<xml-bindings xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm">
<java-types>
<java-type name="example.gettingstarted.Customer">
<xml-root-element />
<java-attributes>
<xml-element java-attribute="name" xml-path="personal-info/name/text()" />
<xml-element java-attribute="address" xml-path="contact-info/address" />
<xml-transient java-attribute="phoneNumbers"/>
</java-attributes>
</java-type>
</java-types>
</xml-bindings>
Для получения дополнительной информации о XML-файле отображения MOXy см.: