问题是关于JAXB Map编组 - 有很多关于如何将Map转换为如下结构的示例:
<map>
<entry>
<key> KEY </key>
<value> VALUE </value>
</entry>
<entry>
<key> KEY2 </key>
<value> VALUE2 </value>
</entry>
<entry>
...
</map>
Run Code Online (Sandbox Code Playgroud)
实际上,这是JAXB原生支持的.但是,我需要的是XML,其中key是元素名称,value是其内容:
<map>
<key> VALUE </key>
<key2> VALUE2 </key2>
...
</map>
Run Code Online (Sandbox Code Playgroud)
我没有按照JAXB开发人员推荐的方式(https://jaxb.dev.java.net/guide/Mapping_your_favorite_class.html)成功实现我的Map适配器,因为我需要,他 - 动态属性名称:)
那有什么解决方案吗?
PS目前我必须为每个我想要编组的典型键值对创建一个专用的容器类 - 它可以工作,但是我必须创建太多这些辅助容器.
我正在使用Jersey和JAXB构建一个简单的RESTful Web服务我有一个'String'的HashMap到'Integer':
2010-04 -> 24
2010-05 -> 45
Run Code Online (Sandbox Code Playgroud)
我需要生成一个如下所示的XML响应:
<map>
<2010-04>24</2010-04>
<2010-05>45</2010-05>
</map>
Run Code Online (Sandbox Code Playgroud)
使用JAXB生成动态标记名称的最佳方法是什么?
我正在尝试实现涉及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 …Run Code Online (Sandbox Code Playgroud)