繁体   English   中英

使用@XmlAnyElement进行HashMap JAXB映射

[英]HashMap JAXB mapping using @XmlAnyElement

我正在尝试实现涉及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但对于这种简单而常见的需求感觉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);
}

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

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

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

@XmlAnyAttribute vs @XmlAnyElement

使用属性,很明显地图键是属性名称,地图值是属性值。 对于元素不太清楚,map键可以是元素名称,但整个元素的值是多少? 如果密钥和值不匹配会发生什么。

映射此用例

您需要为此用例使用XmlAdapter 下面是一个如何使用EclipseLink JAXB(MOXy)完成的示例,我是MOXy的主角:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM