繁体   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