我正在尝试实现涉及HashMap的XML映射.这是我的用例:我想得到这个:
<userParameters>
<KEY_1>VALUE_1</KEY_1>
<KEY_2>VALUE_2</KEY_2>
<KEY_3>VALUE_3</KEY_3>
</userParameters>
Run Code Online (Sandbox Code Playgroud)
我的UserParameters类看起来像这样:
@XmlRootElement
public class UserParameters {
private final Map<QName, String> params = new HashMap<>();
@XmlAnyElement
public Map<QName, String> getParams() {
return params;
}
}
Run Code Online (Sandbox Code Playgroud)
编组时出现以下错误:
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
Run Code Online (Sandbox Code Playgroud)
它工作正常,@XmlAnyAttribute我得到:<userParameters KEY_1="VALUE_1" ... />
从我看到的答案来看,似乎我必须自己制作,XmlAdapter但对于这种简单而常见的需求感觉有些过分.
---更新---
我在这里找到了一个很有前途的解决方案:JAXB HashMap是不可映射的
唯一不方便的是它似乎搞乱了名称空间.
这是我的新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);
}
Run Code Online (Sandbox Code Playgroud)
这是我在XML输出中得到的:
<params:userParameters>
<KEY_1 xmlns="" xmlns:ns5="http://url.com/wsdl">
VALUE_1
</KEY_1>
</params:userParameters>
Run Code Online (Sandbox Code Playgroud)
我不知道为什么JAXB在KEY_1元素中声明了一个名称空间.
@XmlAnyAttribute与@XmlAnyElement对于属性,很明显映射键是属性名称,映射值是属性值。对于元素来说就不太清楚了,映射键可能是元素名称,但是整个元素的值是多少?如果键和值不匹配会发生什么。
XmlAdapter对于此用例,您需要使用 an 。下面是如何使用 EclipseLink JAXB (MOXy) 完成此操作的示例,我是 MOXy 的负责人:
| 归档时间: |
|
| 查看次数: |
2618 次 |
| 最近记录: |