かなり複雑なデータ構造を持っているため、正しくアンマーシャリングできないようです。
@XmlRootElement
class Tree {
@XmlID
private String id;
@XmlJavaTypeAdapter(type=TreeFooAdapter.class)
Map<Tree, Foo> fooMap;
}
class Foo {
@XmlID
private String id;
}
私は2つの別々の木を持っています。2 つのノード (各ツリーから 1 つ) をペアにして、Foo のインスタンスに関連付けることができます。fooMap は、特定のツリー ノードがペアになっている他のノードと、結果として得られる Foo のインスタンスを追跡するために使用されます。
TreeFooAdapter は非常に単純ですが、ID 参照を使用することに注意してください。
public class TreeFooAdapter extends XmlAdapter<TreeFooAdapter.MapType, Map<Tree, Foo>> {
public static class MapType {
public static class MapEntry {
@XmlAttribute
@XmlIDREF
public Tree key;
@XmlAttribute
@XmlIDREF
public Foo value;
}
// etc...
}
// Standard drill for marshal/unmarshal...
}
問題: 前方参照が機能しません! アンマーシャリング時、XML で最初に来る Tree は、その fooMap に null キーを持ちます。2 つのツリーは相互に参照しているため、これを回避するために XML の順序を変更することはできません。
を取得/設定するためのプライベートメソッドがあるハックを試しましたList<TreeFooMapEntry>
が、同じ結果が得られます。
Map または List に含まれている場合、JAXB が前方 ID 参照を処理できないのはなぜですか? また、これを解決するにはどうすればよいですか?