なぜこれが不可能なのですか?とてもシンプルに見えますが、期待どおりに動作しません。
概要:クラスAは集約されたDataA Beanを使用しますが、クラスB(クラスAのサブクラス)は集約されたDataB Beanを使用します(DataBはDataAを拡張します)。
私はこれらのテストクラスを作成して、私の質問を視覚化して説明しました。
クラスA:
package test;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement(name="root")
public class A {
private DataA source = new DataA();
@XmlElement(name="source")
public DataA getSource() {
return source;
}
public void setSource(DataA source) {
this.source = source;
}
}
およびそのDataAクラス(すべてのフィールドがマーシャリングされるようにFIELDアノテーションを使用しました):
package test;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
@XmlAccessorType(XmlAccessType.FIELD)
public class DataA {
public String string1 = "1";
public String string2 = "2";
}
そして今、クラスB(クラスAのサブクラス):私の目標は、Aの機能を再利用し、DataBBeanを使用してDataABeanのプロパティを再利用することです。
package test;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlAccessorType(XmlAccessType.NONE)
@XmlRootElement(name="root")
public class B extends A {
private DataB source = new DataB();
public DataB getSource() {
return this.source;
}
public void setSource(DataB source) {
this.source = source;
}
}
対応するDataBBeanは次のようになります。
package test;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
@XmlAccessorType(XmlAccessType.FIELD)
public class DataB extends DataA {
public String string3 = "3";
}
ここで、クラスAのインスタンスをマーシャルすると、次の出力が得られます。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
<source>
<string1>1</string1>
<string2>2</string2>
</source>
</root>
クラスBのインスタンスをマーシャルすると、まったく同じ結果が得られます。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
<source>
<string1>1</string1>
<string2>2</string2>
</source>
</root>
ただし、string3もマーシャリングされると予想していましたが、これはBeanDataAのプロパティを書き込んでいるだけです。なぜ?これは、OOPの観点から考えると、実際には直感的ではありません。
クラスBにも@XmlElementアノテーションを設定すると、次のようになります。
@XmlElement
public DataB getSource() {
return this.source;
}
...次に、プロパティは、親クラスと子クラスによって一度注釈が付けられるため、2回マーシャリングされます。これは私が望まないことでもあります:
出力は次のとおりです。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
<source xsi:type="dataB" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<string1>1</string1>
<string2>2</string2>
<string3>3</string3>
</source>
<source>
<string1>1</string1>
<string2>2</string2>
<string3>3</string3>
</source>
</root>
結果としてJAXBに期待したのは、次のXMLです。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
<source>
<string1>1</string1>
<string2>2</string2>
<string3>3</string3>
</source>
</root>
JAXBを微調整して期待される結果を生成する方法のヒントはありますか?フィードバックをありがとうございます。