Eclipselink/MOXy 2.3 を使用すると、XML へのマーシャリングで次のユースケースがあります。
abstract class MyAbstract {
}
class MyImpl extends MyAbstract {
}
class A {
private MyAbstract myAbstract;
// MyImpl is behind this
public MyAbstract getMyAbstract() {
return myAbstract;
}
}
oxm.xml で次のマッピングが定義されています。
<java-type name="foo.MyAbstract" xml-accessor-type="NONE">
<xml-see-also>
foo.MyImpl
</xml-see-also>
</java-type>
<java-type name="foo.MyImpl">
<xml-root-element name="MyImpl" />
</java-type>
<java-type name="bar.A" xml-accessor-type="NONE">
<xml-root-element name="A" />
<java-attributes>
<xml-element java-attribute="myAbstract" type="foo.MyAbstract" />
</java-attributes>
</java-type>
これにより、次の結果が得られます。
<A>
<myAbstract xsi:type="myImpl">
<!-- Mapped members of MyImpl + MyAbstract -->
</myAbstract>
</A>
エクスポートされたxmlにプロパティ名が必要なかったので、変更しました:
<java-type name="bar.A" xml-accessor-type="NONE">
<xml-root-element name="A" />
<java-attributes>
<xml-element java-attribute="myAbstract" type="foo.MyAbstract" xml-path="."/>
</java-attributes>
</java-type>
その結果:
<A>
<!-- Members of MyImpl + MyAbstract marshalled without any wrapping element-->
</A>
私が欲しいのは:
<A>
<MyImpl>
<!-- Members of MyImpl + MyAbstract -->
</MyImpl>
</A>
問題は次のとおりです。どうすればこれを達成できますか? MOXy は MyImpl の XmlRootElement を無視しています...
編集:
Blaiseが提案したことを試すと、次の例外が発生します。
Exception [EclipseLink-60] (Eclipse Persistence Services - 2.3.2.v20111125-r10461):
org.eclipse.persistence.exceptions.DescriptorException
The method [] or [getMyAbstract] is not defined in the object [bar.A].
これには、関連性がないと思ったために以前に省略した追加情報が必要です。
クラス A は次を定義するインターフェイスです: public X getMyAbstract();
MyAbstract は X を実装します (これが、インターフェイス A のマッピングに型属性を追加した理由です)。
したがって、xml-element-ref
MOXy を使用してもゲッターは「見えません」xml-element
。