3

スキーマがほぼすべての要素を次のように指定しているサーバーから XML を受信して​​います。

<xs:element name="myStringElementName" type="xs:string" nillable="true" minOccurs="0"/>
<xs:element name="myIntElementName" type="xs:int" nillable="true" minOccurs="0"/>

xsi:nil="true"JAXB オブジェクトに非整列化されたときに nullとしてマークされている受信したすべての要素を変換するクリーンな方法を見つけようとしています。だから、このようなもの:

<myIntElementName xsi:nil="true" />

nil プロパティが true に設定されたオブジェクト (またはそれらの行に沿ったもの)myIntElementNameではなく、null の値を持つプロパティを持つ JAXB オブジェクトになるはずです。JAXBElement属性を使用する XML を送信しているシステムを制御することはできないnillableため、受信時にこれを変換する必要があります。

4

1 に答える 1

6

@XmlElement(nillable = true)

@XmlElement(nillable=true)この動作を取得するには、フィールド/プロパティで指定する必要があります。

@XmlElement(nillable=true)
private String foo;

XMLスキーマからの生成

以下に、XMLスキーマから見つめている場合にこのマッピングを生成する方法を示します。

XMLスキーマ(schema.xsd)

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="foo">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="myStringElementName" type="xs:string"
                    nillable="true" minOccurs="0" />
                <xs:element name="myIntElementName" type="xs:int"
                    nillable="true" minOccurs="0" />
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

タイプのプロパティを取得する理由JAXBElement

JAXBElementこれはnillable要素があるため、タイプのプロパティがモデルに生成されますminOccurs="0"。を使用するとJAXBElement、モデルは欠落している要素(プロパティがnull)とnil="true"(nilフラグが設定されたJAXBElement)を持つ要素の存在を区別できます。

<xs:element name="myStringElementName" type="xs:string"
                        nillable="true" minOccurs="0" />

外部バインディングファイル(binding.xml)

外部バインディングファイルを指定して、JAXB実装にタイプのプロパティを生成しないように指示できますJAXBElement。これにより、JAXBがすべてのXMLドキュメントをラウンドトリップできなくなることに注意してください。

<?xml version="1.0" encoding="UTF-8"?>
<jaxb:bindings version="2.0"
               xmlns:jaxb="http://java.sun.com/xml/ns/jaxb">
    <jaxb:bindings>
        <jaxb:globalBindings generateElementProperty="false"/>
    </jaxb:bindings>
</jaxb:bindings>

XJCコール

以下は、XJC呼び出しから外部バインディングファイルを活用する方法の例です。

xjc -b binding.xml schema.xsd

生成されたモデル(Foo)

生成されたモデルは次のようになります。

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "myStringElementName",
    "myIntElementName"
})
@XmlRootElement(name = "foo")
public class Foo {

    @XmlElement(nillable = true)
    protected String myStringElementName;
    @XmlElement(nillable = true)
    protected Integer myIntElementName;

    public String getMyStringElementName() {
        return myStringElementName;
    }

    public void setMyStringElementName(String value) {
        this.myStringElementName = value;
    }

    public Integer getMyIntElementName() {
        return myIntElementName;
    }

    public void setMyIntElementName(Integer value) {
        this.myIntElementName = value;
    }

}

詳細については

于 2012-09-20T19:43:42.150 に答える