java - MOXy 的 xml-transient 声明是如何工作的?

标签 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 注释,您可以将元素(字段或属性)声明为 transient 的,但 eclipselink-oxm.xml 仅允许对类型进行 transient 声明。但是,当我像这样声明一个类型 transient 时,我得到以下异常:

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

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 的情况下抑制电话号码的编码?

最佳答案

您可以指定使用以下映射文件使 Customer 上的“phoneNumbers”属性变为 transient :

<?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 映射文件的更多信息,请参阅:

关于java - MOXy 的 xml-transient 声明是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5459659/

相关文章:

java - 向日期添加秒数

java - 什么会导致 @XmlRootElement 类被解码到 JaxbElement 中?

java - spring ws SOAP 客户端+jaxb2

jpa - 为什么 EntityManager 插入而不是更新?

java - Android应用程序启动后立即崩溃

java - 二分查找--同一个数组中的 double 和整数

java - 自定义hyperjaxb3生成实体的表名?

JPA 标准 JOIN 等 ON

tomcat - Tomcat 集群上的 Eclipselink 缓存协调

Java - 如何为方法提供数组