我有以下课程:
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
元素?
我尝试XmlElement
在我的 JAXB 配置中删除该元素,但最终得到
<a/>
JAXB 甚至没有调用适配器代码。
我的第二次尝试是使用另一个适配器AAdapter
(应该直接处理A
对象),我认为可以通过这种方式进行配置:
<Class name="A">
<XmlRootElement name="a"/>
<XmlJavaTypeAdapter value="AAdapter"/>
</Class>
但是随后它的marshal()
方法没有被调用,并且我没有来自 JAXB 的错误消息(这可能是由于我们的 JAXB 配置是另一回事)。我得到以下输出:
<a/>
应该AAdapter
直接产生entry
如果被调用,则
我看到了多个有关如何删除sub的中间标记的相关帖子属性的中间标记的相关帖子,但它们似乎与我的问题不同,因为在这里我想删除直接属性的元素。
那么如何在不将结果放入元素的情况下为属性调用适配器?或者我如何直接在类上调用适配器进行序列化?
提前感谢您的回答。
编辑:根据这张 JAXB 票,这在设计上似乎是不可能的,但如果有人有解决方法,那就太好了。