[英]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.