簡體   English   中英

JAXB XmlIDREF和地圖/列表

[英]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類中時不起作用。

我這次嘗試了另一種似乎有效的黑客手段。 訣竅涉及以下內容:

  • 創建一個私有的getter / setter對,將fooMap轉換為TreeFooAdapter.MapType
  • 將XmlID添加到TreeFooAdapter.MapType,並使用XmlIDREF注釋getter
  • 維護TreeFooAdapter.MapType的靜態實例集
  • 封送時,封送Tree和Foo的所有實例后,還封送實例集。

這樣可以生成更清晰的XML:將樹和它們的fooMap組合在一起,使用簡單的IDREF進行編排,而XML文件的末尾只是TreeFooAdapter.MapTypes的一長串列表,而TreeFooAdapter.MapTypes本身就是成對的IDREF。 如果封送/解封不止一次,則必須小心清除靜態的實例集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM