MOXyのJAXB実装と外部メタデータバインディングファイルを使用した継承とポリモーフィズムを含むマーシャリング/アンマーシャリングの問題に直面しています。
XMLファイルやモデルクラスを制御することはできません。
モデル内には、他のDTOクラスを継承する複数のクラスがあります。これが私が作業している環境の例です。この例は構文上の目的のためだけにここにあります。実際の環境にはネストされた継承、コレクションなどが含まれます。
これが継承されるクラスです
class A {
private String name;
public String getName(){
return name;
}
public void setName(String value){
name = value;
}
}
これが1つの継承されたクラスです
class B extends A {
private String attrFromB;
public String getAttrFromB(){
return attrFromB;
}
public void setAttrFromB(String value){
attrFromB = value;
}
}
そして別の
class C extends A {
private String attrFromC;
public String getAttrFromC(){
return attrFromC;
}
public void setAttrFromC(String value){
attrFromC= value;
}
}
これがコンテナクラスです
class MyContainerClass{
private A myObject;
public A getMyObject(){
return myObject;
}
public void setMyObject(A value){
myObject = value;
}
}
これは、Aを含むMyContainerの場合に生成する必要があるXMLです。
<MyContainer>
<MyObject nameA="foo" />
</MyContainer>
Bを含むMyContainer
<MyContainer>
<MyObject nameB="foo" attrFromB="bar" />
</MyContainer>
そしてCを含むMyContainer
<MyContainer>
<MyObject nameC="foo" attrFromC="bar" />
</MyContainer>
だからあなたはすでに地平線の問題を見ることができます...
これが私が書くマッピングファイルです:
<?xml version="1.0"?>
<xml-bindings
xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
package-name="com.test.example"
version="2.1">
<java-type name="A" xml-accessor-type="NONE">
<xml-root-element name="MyObject" />
<java-attributes>
<xml-element java-attribute="name" xml-path="@nameA" />
</java-attributes>
</java-type>
<java-type name="B" xml-accessor-type="NONE">
<xml-root-element name="MyObject" />
<xml-see-also>
com.test.example.A
</xml.see.also>
<java-attributes>
<xml-element java-attribute="name" xml-path="@nameB" />
<xml-element java-attribute="attrFromB" xml-path="@attrFromB" />
</java-attributes>
</java-type>
<java-type name="C" xml-accessor-type="NONE">
<xml-root-element name="MyObject" />
<xml-see-also>
com.test.example.A
</xml.see.also>
<java-attributes>
<xml-element java-attribute="name" xml-path="@nameC" />
<xml-element java-attribute="attrFromC" xml-path="@attrFromC" />
</java-attributes>
</java-type>
<java-type name="MyContainer" xml-accessor-type="NONE">
<xml-root-element name="MyContainer" />
<java-attributes>
<xml-element java-attribute="myObject" type="com.test.example.A" xml-path="MyObject" />
</java-attributes>
</java-type>
</xml-bindings>
最初の問題は、そのようにクラスをバインドすると、次の例外が発生することです。
[Exception [EclipseLink-44] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Missing class indicator field from database row [UnmarshalRecord()].
最初の質問:これは正常であると理解しています。JaxbはMyContaioner.myObject属性のタイプを判別するための何らかの方法が必要です。問題は、着信XMLファイルにアクセスできないため、xsi:typeフィールドを追加できないことです。クラス内の特定の属性の存在に基づいてクラスを決定する方法はありますか?その値に関係なく。ソースxmlに@attrFromC属性が含まれている場合、オブジェクトはタイプCである必要があります。attrFromBが含まれている場合はBです。
2番目の問題は、「name」属性がBとCの内部に存在しないため、jaxbがemを無視することです。
--Ignoring attribute [name] on class [com.test.example.B] as no Property was generated for it.
--Ignoring attribute [name] on class [com.test.example.C] as no Property was generated for it.
2番目の質問:もう1つの問題は、JaxbがXMLファイル内で期待されるようにxml属性名をオーバーライドできるかどうかわからないことです(@ nameA、@ nameB、nameCはすべてA.nameを参照しています)。それ ?
よろしくお願いします。