私は現在、私のプロジェクトにこの環境を持っています:
public abstract class Foo {
private List<Thing> things;
public List<Thing> getThings() { return this.things; }
}
public abstract class Bar extends Foo {
@XmlElements({@XmlElement(name = "first", type = First.class)})
public List<Thing> getThings() { return super.getThings(); }
}
public class Bobar extends Bar {
@XmlElements({@XmlElement(name = "second", type = Second.class)})
public List<Thing> getThings() { return super.getThings(); }
}
次の XML ドキュメントの場合
<bobar>
<first>blablabla</first>
<second>blublublu</second>
</bobar>
私がする時
context = JAXBContext.newInstance("the.package.structure");
unmarshaller = context.createUnmarshaller();
Bar object = (Bar) unmarshaller.unmarshal("path-to-xml-document");
Barobject
のコレクションには 2 ではなく 1 つの要素しかありません。First
要素は完全に失われます。実行しようとするとobject.getThings()
、そのサイズは 1 で、コレクション内の唯一のオブジェクトは のインスタンスですSecond
。コレクション内の両方のオブジェクトを取得するにはどうすればよいですか? それが不可能な場合、どうすればこれに似たものを達成できますか?
私がこれを行っている理由は、(私のプロジェクト ロジックでは) すべてBobar
の s のコレクションがFirst
そのコレクションに を持っていますが、すべてBar
がSecond
そのコレクションに を持っているわけではなくFoo
、ジェネリック クラスであるためです。
編集:
XML ドキュメントの順序を変更すると、出力が異なります。
<bobar>
<second>blablabla</second>
<first>blublublu</first>
</bobar>
このシナリオでFirst
は、コレクション内ののインスタンスのみを取得し、Second
失われます。さらにシナリオを変更すると、興味深い結果が得られます。
public abstract class Foo {
private List<Thing> things;
public List<Thing> getThings() { return this.things; }
}
public abstract class Bar extends Foo {
@XmlElements({@XmlElement(name = "first", type = First.class), @XmlElement(name = "third, type = Third.class)})
public List<Thing> getThings() { return super.getThings(); }
}
public class Bobar extends Bar {
@XmlElements({@XmlElement(name = "second", type = Second.class)})
public List<Thing> getThings() { return super.getThings(); }
}
私が行った場合
<bobar>
<third>bliblibli</third>
<second>blablabla</second>
<first>blublublu</first>
</bobar>
理論的には、ここでの順序が正しくないため、それによって生成された XML スキーマに対してこれを検証するべきではないと思います。しかし、それ以外にも、そのようなシナリオでは、Second
とが失われます。First
Third