2011-07-22 10 views
12

私は共通のフィールドを持っているJAXB注釈付きクラスの束を持っているので、私は文句IllegalAnnotationExceptionを取得したときにIマーシャルFooの1またはBar私は今、このCan/"propOrder"アノテーションのJAXBマップBeanの継承プロパティをリストすることはできますか?

public class Base { 
    protected SomeType commonField; 
} 

@XmlRootElement(name = "foo") @XmlType(propOrder = { "commonField", "fooField" }) 
public class Foo extends Base { 
    private SomeOtherType fooField; 
} 

@XmlRootElement(name = "bar") @XmlType(propOrder = { "commonField", "barField" }) 
public class Bar extends Base { 
    private SomeOtherType barField; 
} 

のように、スーパークラスにそのフィールドを移動約commonFieldpropOrderに記載されているが、クラスには存在しない。 propOrderアノテーションからそれを削除すると、すべて正常に動作しますが、マップされたすべてのフィールドを一覧表示するはずです。私は何が欠けていますか?

答えて

23

継承されたクラスのフィールド/プロパティは、常に子クラスのフィールド/プロパティの前に表示されます。つまり、デフォルトでは、子タイプのpropOrderで指定することはできません。ただし、親クラスを@XmlTransientとマークすると、フィールド/プロパティは子クラスに属するものとして扱われ、propOrderに含めることができます。

+0

スーパークラスのプライベートな実装の詳細にサブクラスでこのカップルの注釈があることに注意してください。手動で 'propOrder'を変更することなく、スーパークラスのフィールド名を偶然リファクタリングすると、サブクラスの直列化が中断されます。スーパークラスにシリアル化されたフィールドを追加します。また、 'propOrder'の名前は@XmlElementアノテーションで提供される名前ではなく、Javaのフィールドやプロパティの識別子です。 [それは、この答えは今日私にとって非常に役に立ちました。] –

関連する問題