JAXBのEclipseLink実装(2.3)を使用してPOJOをXMLにマップしていますが、次のユースケースで問題が発生しています。
public abstract class A {
public abstract Set<X> getX();
// There is no setter
}
public class B extends A {
// Set via constructor
private Set<X> x;
@Override
public Set<X> getX();
}
マッピング自体を外部バインディングファイルで完全に定義しています。クラスAを次のように一時的に設定します。
<java-type name="foo.A" xml-transient="true"/>
クラスBの場合:
<java-type name="bar.B" xml-accessor-type="PROPERTY">
<xml-root-element name="B" />
<java-attributes>
<xml-element java-attribute="x" xml-path="..."/>
</java-attributes>
</java-type>
さて、マーシャリングすると、例外が発生します。「[x]という名前の重複プロパティがクラス[bar.B]で見つかりました」。これは、私の意見では、Aの抽象宣言に由来し、Bに継承されています。
BのアクセサタイプをFIELDに設定すると、このエラーが解消されます。残念ながら、これはオプションではありません。Bには、フィールドではなく計算値を返すマーシャル用の追加のプロパティがあるため、PROPERTYでスタックします。 (以下の作業:BのアクセサータイプをFIELDに設定し、追加のプロパティを@XmlPathアノテーションでマッピングします-ただし、コードにアノテーションは必要ありません)。
クラスBのアクセサタイプのPROPERTYで立ち往生していたので、次の試みは次のとおりでした。
<java-type name="foo.A" xml-accessor-type="NONE"/>
抽象プロパティがBに継承されないようにするには、次のようにします。
Ignoring attribute [x] on class [bar.B] as no Property was generated for it.
このマッピングを使用しても同じことが起こります。
<java-type name="foo.A" xml-accessor-type="PROPERTY">
<java-attributes>
<xml-transient java-attribute="x"/>
</java-attributes>
</java-type>
どちらの場合も、プロパティ'x'は無視されます。
私は今これにかなりの時間を費やしてきました-これを機能させることが不可能だとは想像できませんか?
現時点での私の回避策:
foo.Aを一時的なものとして残し、bar.BにアクセサータイプのFIELDを指定して(問題なくプロパティ'x'を取得します)、コードの注釈を使用してBの追加のプロパティをマッピングします。しかし、前に述べたように、私はこれを注釈なしで完全に解決したいと思います-誰かアイデアはありますか?ブレイズ?:)
よろしく、
--qu