gpt4 book ai didi

java - 使用 @XmlAnyElement 的 HashMap JAXB 映射

转载 作者:搜寻专家 更新时间:2023-10-31 20:34:36 28 4
gpt4 key购买 nike

我正在尝试实现涉及 HashMap 的 XML 映射。这是我的用例:我想得到这个:

<userParameters>
<KEY_1>VALUE_1</KEY_1>
<KEY_2>VALUE_2</KEY_2>
<KEY_3>VALUE_3</KEY_3>
</userParameters>

我的 UserParameters 类如下所示:

@XmlRootElement
public class UserParameters {

private final Map<QName, String> params = new HashMap<>();

@XmlAnyElement
public Map<QName, String> getParams() {
return params;
}

}

编码时出现以下错误:

Caused by: javax.xml.bind.JAXBException: class java.util.HashMap nor any of its super class is known to this context.
at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getBeanInfo(JAXBContextImpl.java:593)
at com.sun.xml.bind.v2.runtime.property.SingleReferenceNodeProperty.serializeBody(SingleReferenceNodeProperty.java:109)
... 54 more

@XmlAnyAttribute 配合使用效果很好我得到:<userParameters KEY_1="VALUE_1" ... />

从我看到的答案来看,似乎我必须自己做 XmlAdapter但对于这样一个简单而普遍的需求来说,感觉有点矫枉过正。

---更新---

我在这里找到了一个有前途的解决方案:JAXB HashMap unmappable

唯一不方便的是它似乎弄乱了命名空间。

这是我的新 UserParameters 类:

@XmlAnyElement
public List<JAXBElement> getParams() {
return params;
}

public void addParam(String key, String value) {
JAXBElement<String> element = new JAXBElement<>(new QName(key), String.class, value);
this.params.add(element);
}

这是我在 XML 输出中得到的:

<params:userParameters>
<KEY_1 xmlns="" xmlns:ns5="http://url.com/wsdl">
VALUE_1
</KEY_1>
</params:userParameters>

我不知道为什么 JAXB 在 KEY_1 元素中声明一个命名空间。

最佳答案

@XmlAnyAttribute@XmlAnyElement

对于属性,很明显映射键是属性名称,映射值是属性值。对于元素不是很清楚,映射键可以是元素名称,但整个元素的值是多少?如果键和值不匹配会发生什么。

映射此用例

对于此用例,您需要使用 XmlAdapter。下面是一个如何使用 EclipseLink JAXB (MOXy) 完成的示例,我是 MOXy 的负责人:

关于java - 使用 @XmlAnyElement 的 HashMap JAXB 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20885742/

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