如何在序列化时忽略字段

时间:2018-02-08 01:21:35

标签: java xsd jaxb

我有一个xsd架构,我在Cart对象中添加了一个新字段owner_email。当我将Cart Object发送到其他系统(作为json请求)或返回Cart对象作为响应(作为json)我想要传递owner_email字段时,我希望在我们的应用程序中。我可以为owner_email字段设置任何属性吗?

<xs:complexType name="Cart">
    <xs:sequence>
        <xs:element name="id" type="xs:string" minOccurs="0" maxOccurs="1" />
        <xs:element name="name" type="xs:string" minOccurs="0" maxOccurs="1" />
        <xs:element name="owner_id" type="xs:string" minOccurs="0" maxOccurs="1" />
        <xs:element name="owner_email" type="xs:string" minOccurs="0" maxOccurs="1" />
    </xs:sequence>
</xs:complexType>

这里我没有编辑生成的java代码。我需要修改xsd文件本身。我应该在xsd中使用什么属性来指定相同的属性。

1 个答案:

答案 0 :(得分:1)

我有办法让它发挥作用,但有2&#34;陷阱&#34;我不是很满意。

首先,将xsd更改为:

def process_url(url) do
  endpoint = Application.get_env(...)
  if String.starts_with?(url, endpoint), do: url, else: endpoint <> url
end

然后你可以创建绑定文件来生成其他用户提到的瞬态注释:

<xs:element name="Cart">
        <xs:complexType>
            <xs:all>
                <xs:element name="id" type="xs:string" minOccurs="0" maxOccurs="1" />
                <xs:element name="name" type="xs:string" minOccurs="0" maxOccurs="1" />
                <xs:element name="owner_id" type="xs:string" minOccurs="0" maxOccurs="1" />
                <xs:element  name="ownerEmail" type="xs:string" minOccurs="0" maxOccurs="1" />
            </xs:all>
        </xs:complexType>
    </xs:element>

这将在编组以下xml时生成:

<jxb:bindings
        xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:annox="http://annox.dev.java.net"
        xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd"
        jxb:extensionBindingPrefixes="xjc annox" version="2.1">

    <jxb:bindings schemaLocation="../xsd/cart.xsd">
        <jxb:bindings node="//xs:element[@name='Cart']//xs:complexType//xs:all//xs:element[@name='ownerEmail']">
            <annox:annotate target="field">
                <annox:annotate annox:class="javax.xml.bind.annotation.XmlTransient" />
            </annox:annotate>
        </jxb:bindings>
    </jxb:bindings>
</jxb:bindings>

陷阱:

  1. 元素序列变为xs:all,如果不是,它会创建一个 POJO中的propOrder,这也会列出瞬态字段 会引起问题
  2. 重命名字段&#34; owner_email&#34;到&#34; ownerEmail&#34;因为第一个版本 将生成(以及瞬态)@XmlElement与 owner_email名称,并根据命名约定包含该字段。

    我会试着看看我是否可以找到这些方法,但是现在也许这会有所帮助。干杯!