2012-10-01 4 views
8

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

親クラス:サブクラスのための今

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

    ... setter/getter 
} 

:私は、次のXMLを取得ConcreteClassのインスタンスをmasrhallとき

@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 ... 
} 

は:

<?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フィールドを無視する方法はありますか?

答えて

6

私はあなたの問題を理解しました。ここに解決策があります。

JAXBは、マーシャリング中にフィールドを無視するように@XmlTransient(javax.xml.bind.annotation.XmlTransient)(javadoc)を提供します。フィールドはそのcorrespodingゲッター/セッターメソッドと一緒に @XmlTransient としてあなたの派生クラス(ConcreteRequest.class)に "UUID"

オーバーライド。 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 ... 
} 

これは、ベースクラス属性を上書きします。

詳細については、私に連絡してください。

+0

残念ながら私は自分の状況でそれが可能だとは思わない。 UUIDフィールドはデータベースに保持されているため、オーバーライドすると危険です。 私のクラスは、UUIDを持っているがXMLスキーマに属していない特別なサブクラスです。 – prozaak

+0

私の分析から、JAXBはあなたの要求に適したオプションを提供していません。JAXBの動作を利用することをお勧めします - "null値要素は@XmlElement(nillable = false)のとき無視されます"。したがって、マーシャリングの時に、値が「uuid」の明示性をnullにして、マーシャル時にプロパティを構築しないようにします。 サンプルコードがありますが、ここで共有できませんでした。 – omega

+0

これは機能しません。 – GoalBased

0

あなたは親クラスに

@XmlAccessorType(XmlAccessType.NONE) 

を使用して、派生クラスの

@XmlAccessorType(XmlAccessType.FIELD) 

ことができます。

関連する問題