我有以下课程:
class A {
Map<String, String> mapping;
public A() {...}
private Map<String, String> getMapping() {...};
private void setMapping(Map<String, String> mapping) { ... };
}
我需要能够使用以下表示在XML中序列化/反序列化此类:
<a>
<entry key="foo" value="bar"/>
<entry key="xbaz" value="xklux"/>
</a>
我们使用 jaxb-intros 为这些类配置JAXB,我有以下配置:
<Class name="A">
<XmlRootElement name="a"/>
<Method name="getMapping">
<XmlElement name="mapping"/>
<XmlJavaTypeAdapter value="MappingAdapter"/>
</XmlMethod>
</Class>
哪个有效但产生:
<a>
<mapping>
<entry key="test" value="a"/>
<entry key="mdx.foo" value="bar"/>
</mapping>
</a>
我的问题是:如何摆脱这个糟糕的mapping
元素?
我尝试删除JAXB配置中的XmlElement
元素,但后来我最终使用
<a/>
JAXB甚至没有调用适配器代码。
我的第二个尝试是使用另一个适配器AAdapter
(应该直接处理A
对象),我想这可以通过这种方式配置:
<Class name="A">
<XmlRootElement name="a"/>
<XmlJavaTypeAdapter value="AAdapter"/>
</Class>
但是它的marshal()
方法没有调用,我没有来自JAXB的错误消息(这可能是由于我们的JAXB配置,这是另一个故事)。我得到以下输出:
<a/>
AAdapter
如果被调用,应直接生成entry
元素。
我看到有关如何删除 sub 属性的中间标记的多篇相关帖子,但它们似乎与我的问题不同,因为我在这里要删除直接属性的元素。
那么如何在不将结果放入元素的情况下为属性调用适配器?或者如何直接在类上调用适配器来序列化?
提前感谢您的回答。
编辑:基于this JAXB ticket这似乎是不可能的设计,但如果有人有解决方法,那就太棒了。