JAXB编组类只有一个没有中间元素的属性

时间:2012-07-20 09:40:07

标签: java xml jaxb marshalling

我有以下课程:

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这似乎是不可能的设计,但如果有人有解决方法,那就太棒了。

0 个答案:

没有答案