使用自定义JiBX marshaller的抽象映射

时间:2011-02-08 01:46:47

标签: jibx

我创建了一个自定义的JiBX marshaller并验证它是否有效。它的工作原理如下:

<binding xmlns:tns="http://foobar.com/foo" direction="output">
  <namespace uri="http://foobar.com/foo" default="elements"/>
  <mapping class="java.util.HashMap" marshaller="com.foobar.Marshaller1"/>
  <mapping name="context" class="com.foobar.Context">
    <structure field="configuration"/>
  </mapping>
</binding>

但是我需要为不同的HashMaps创建多个marshallers。所以我尝试用这样的抽象映射来引用它:

<binding xmlns:tns="http://foobar.com/foo" direction="output">
  <namespace uri="http://foobar.com/foo" default="elements"/>
  <mapping abstract="true" type-name="configuration" class="java.util.HashMap" marshaller="com.foobar.Marshaller1"/>
  <mapping abstract="true" type-name="overrides" class="java.util.HashMap" marshaller="com.foobar.Marshaller2"/>
  <mapping name="context" class="com.foobar.Context">
    <structure map-as="configuration" field="configuration"/>
    <structure map-as="overrides" field="overrides"/>
  </mapping>
</binding>

但是,当我这样做时,当我尝试构建绑定时,我会收到以下内容:

Error during code generation for file "E:\project\src\main\jibx\foo.jibx" - this may be due to an error in your binding or classpath, or to an error in the JiBX code

我的猜测是,我缺少一些我需要实现的东西,以启用我的自定义编组器进行抽象映射,或者自定义编组器不支持抽象映射。

我在JiBX API(http://jibx.sourceforge.net/api/org/jibx/runtime/IAbstractMarshaller.html)中找到了IAbstractMarshaller接口,但是如果这是我需要实现的,那么文档似乎不清楚,以及它是如何工作的。作为一个例子,我无法找到这个接口的实现。

我的问题是,你如何使用自定义编组器进行抽象映射(如果可能的话)?如果是通过IAbstractMarshaller接口完成的,它是如何工作的和/或我应该如何实现它?

1 个答案:

答案 0 :(得分:2)

我不确定IAbstractMarshaller接口是否是您正在寻找的;文档有点不清楚。如果你不介意重复一点,你可以直接在结构映射上指定编组器,这应该得到所需的结果('configuration'和'overrides'的单独映射):

<binding xmlns:tns="http://foobar.com/foo" direction="output">
  <namespace uri="http://foobar.com/foo" default="elements"/>
  <mapping name="context" class="com.foobar.Context">
    <structure map-as="configuration" field="configuration" marshaller="com.foobar.Marshaller1"/>
    <structure map-as="overrides" field="overrides" marshaller="com.foobar.Marshaller2"/>
  </mapping>
</binding>