gpt4 book ai didi

java - JAXB XmlIDREF 和映射/列表

转载 作者:行者123 更新时间:2023-12-01 05:09:43 25 4
gpt4 key购买 nike

我有一个相当复杂的数据结构,我似乎无法正确解码。

@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 的顺序来解决此问题。

我尝试过一种破解,其中我有一个私有(private)方法来获取/设置 List<TreeFooMapEntry> ,但它产生相同的结果。

当转发 ID 引用包含在映射或列表中时,为什么 JAXB 无法处理它们?如何解决此问题?

最佳答案

我找到了一个(可怕的、糟糕的、丑陋的)解决方法,灵感来自 this 。我基本上概括了 PhoneNumberAdapter 类以处理任何“可识别”的东西,即具有唯一的 ID(即 Foo 和 Tree)。我没有 AdaptedPhoneNumber 类,而是有一个 ObjectWrapper bean,它将包含被包装的实际对象(第一次遇到时),或者仅包含其 ID(在后续遇到时)。 TreeFooAdapter 中的 MapEntry 类没有使用 XmlIDREF,而是将我的 IdentifyingAdapter 指定为 XmlJavaTypeAdapter。

这会创建可怕的、不可读的 XML,但至少它可以工作。不过,这似乎是 JAXB 中的一个错误:经过一些痛苦的调试后,我仍然无法弄清楚为什么 XmlIDREF 在改编后的 Map 类内部不起作用。

关于java - JAXB XmlIDREF 和映射/列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12192964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com