8

1 つのプロパティに JAXB アノテーションを持つクラスがあります。次に、残りの重要なデータに注釈を付けるいくつかのサブクラスがあります。ただし、マーシャリングされないように、親クラスのアノテーションを無視したいサブクラスが 1 つあります。コード例を次に示します。

親クラス:

@XmlType(name="Request")
@XmlAccessorType(XmlAccessorType.NONE)
public abstract class Request {
    @XmlElement(required=true)
    private UUID uuid;

    ... setter/getter
}

サブクラスの場合:

@Xsd(name="concreteRequest")
@XmlRootElement("ConcreteRequest")
@XmlType(name="ConcreteRequest")
@XmlAccessorType(XmlAccessorType.FIELD)
public class ConcreteClass {
    @XmlElement(required=true)
    private String data1;
    @XmlElement(required=true)
    private String data1;

    ... setters/getters ...
}

ConcreteClass のインスタンスを masrhall すると、次の XML が得られます。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ConcreteRequest>
    <uuid>uuid</uuid>
    <data1>data</data1>
    <data2>data</data3>
</ConcreteRequest>

次のような XML が必要な場合:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ConcreteRequest>
    <data1>data</data1>
    <data2>data</data3>
</ConcreteRequest>

Request の他の実装がありますが、UUID が必要です。これは単なる特殊なケースです。ConcreteRequest の UUID フィールドを無視する方法はありますか?

4

2 に答える 2

8

私はあなたの問題を理解したと思います。これが解決策です。

JAXB は、マーシャリング中にフィールドを無視する@XmlTransient(javax.xml.bind.annotation.XmlTransient)(javadoc)を提供します。

派生クラス (ConcreteRequest.class) でフィールド「uuid」@XmlTransientとして、対応する Getter/Setter メソッドと共にオーバーライドします。Getter/Setter メソッドもオーバーライドする必要があります。これらはマーシャリング中に呼び出されます。

@Xsd(name="concreteRequest")
@XmlRootElement("ConcreteRequest")
@XmlType(name="ConcreteRequest")
@XmlAccessorType(XmlAccessorType.FIELD)
public class ConcreteClass {
    @XmlElement(required=true)
    private String data1;
    @XmlElement(required=true)
    private String data2;
    @XmlTransient
    private UUID uuid;

    ... setters/getters ...
}

これにより、Base Class 属性がオーバーライドされます。

詳細については、私に戻ってください。

于 2012-10-01T13:01:40.647 に答える