Абстрактное отображение с пользовательским маршаллером JiBX - PullRequest
2 голосов
/ 08 февраля 2011

Я создал собственный маршаллер JiBX и убедился, что он работает.Это работает следующим образом:

<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.Поэтому я попытался сослаться на это с помощью абстрактного отображения следующим образом:

<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

Мое предположениев том, что я либо упускаю что-то, что мне нужно реализовать, чтобы включить свой собственный маршаллер для абстрактного отображения, либо пользовательские маршаллеры не поддерживают абстрактное отображение.

Я нашел интерфейс IAbstractMarshaller в API JiBX (http://jibx.sourceforge.net/api/org/jibx/runtime/IAbstractMarshaller.html), однако документация мне не ясна, если это то, что мне нужно реализовать, а также то, как это работает, если так. Мне не удалось найти реализацию этого интерфейса для работы в качестве примера.

У меня вопрос: как вы делаете абстрактное отображение с помощью пользовательских маршаллеров (если это возможно)? Если это делается через интерфейс IAbstractMarshaller, как это работает и / или как я должен это реализовать?

1 Ответ

2 голосов
/ 08 февраля 2011

Я не уверен, что вам нужен интерфейс IAbstractMarshaller;Документы немного неясны.Если вы не возражаете против небольшого повторения, вы можете указать маршаллера непосредственно в вашем отображении структуры, которое должно получить желаемый результат (отдельные отображения для «конфигурации» и «переопределений»):

<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>
...