[英]JAXB XmlIDREF and Maps/Lists
我有一個相當復雜的數據結構,似乎無法正確解組。
@XmlRootElement
class Tree {
@XmlID
private String id;
@XmlJavaTypeAdapter(type=TreeFooAdapter.class)
Map<Tree, Foo> fooMap;
}
class Foo {
@XmlID
private String id;
}
我有兩棵單獨的樹。 兩個節點(每棵樹一個)可以配對並與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中的第一個樹將在其fooMap中具有空鍵。 由於這兩個樹相互引用,因此我無法更改XML的順序來解決此問題。
我嘗試了一種黑客方法,其中我有一個私有方法來獲取/設置List<TreeFooMapEntry>
,但是它會產生相同的結果。
當JAXB包含在Map或List中時,為什么它們無法處理正向ID引用,我該如何解決呢?
我已經找到了(可怕的,可怕的,丑陋的)的解決方法,啟發這個 。 我基本上使PhoneNumberAdapter類可以與任何“可識別的”東西一起工作,即具有唯一的ID(即Foo和Tree)。 我沒有一個AdaptedPhoneNumber類,而是有一個ObjectWrapper Bean,它將包含被包裝的實際對象(首次遇到時),或者僅包含其ID(在后續遇到時)。 TreeFooAdapter中的MapEntry類沒有XmlIDREF,而是將IdentifiableAdapter指定為XmlJavaTypeAdapter。
這會創建令人討厭的,無法讀取的XML,但至少可以正常工作。 仍然,這似乎是JAXB中的錯誤:經過一些痛苦的調試之后,我仍然無法弄清楚為什么XmlIDREF在適應的Map類中時不起作用。
我這次嘗試了另一種似乎有效的黑客手段。 訣竅涉及以下內容:
這樣可以生成更清晰的XML:將樹和它們的fooMap組合在一起,使用簡單的IDREF進行編排,而XML文件的末尾只是TreeFooAdapter.MapTypes的一長串列表,而TreeFooAdapter.MapTypes本身就是成對的IDREF。 如果封送/解封不止一次,則必須小心清除靜態的實例集。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.