MOXy的xml瞬态声明如何工作?

时间:2011-03-28 13:27:36

标签: java jaxb eclipselink moxy

我在一个单独的项目中有一组bean,我无法改变。这些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。有没有办法可以在不修改Customer bean的情况下抑制电话号码的编组?

1 个答案:

答案 0 :(得分:2)

您可以指定使用以下映射文件在Customer瞬态中生成“phoneNumbers”属性:

<?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>

有关MOXy的XML映射文件的更多信息,请参阅: