Как избежать дублирования кода, используя JAXB с элементами-контейнерами -с похожей структурой

Ситуация

Я использую реализацию MOXy JAXB для работы с большим XML-документом, схема которого имеет много схожих сложных типов. В частности, существует около двух десятков типов, которые действуют как элементы-оболочки списка со следующей структурой:

<ITEMS attr1="X" attr2="Y">
  <ITEM>...</ITEM>
 ...
  <EXTENSION/>
<ITEMS>

Для каждого из этих элементов, подобных оболочке -списка -, изменяется имя и изменяется содержащийся элемент списка. Однако атрибуты (, которые являются необязательными ), и единственный элемент EXTENSION (, также необязательный ), всегда присутствуют. Вот пример использования двух типов:

<ROLES visible="false">
  <ROLE type="X"/>
  <ROLE type="Y"/>
</ROLES>

<PAYMENTS visible="true">
  <PAYMENT>
    <PAYEENAME>Joe</PAYEENAME>
  </PAYMENT>
  <EXTENSION>
    <SOMETHING>Here</SOMETHING>
  </EXTENSION>
</PAYMENTS>

Вопрос

Я хотел бы избежать дублирования кода, поскольку единственное, что меняется между этими элементами, — это имя и еще один -или -элемент, который он содержит. Как лучше всего это сделать?

Я вижу только два возможных решения.

1

Создание конкретного класса с использованием дженериков для указания типа объекта, который будет использоваться в изменяемой коллекции. Затем используйте внешние OX-сопоставления MOXy, чтобы указать, как следует сериализовать любое отдельное использование класса. Что-то вроде:

public class GenericContainer<T> {
 @XmlAttribute
 protected Boolean visibile;
 @XmlElement(name = "Extension")
 protected Extension extension;

 // OX Mappings done in external meta file
 protected List<T> items;
...
}

Хотя мне нравится этот вариант, похоже, невозможно переопределить сопоставления OX класса для каждого -использования.

2

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

Возможно ли #1, или есть лучший способ справиться с этим, о котором я не подумал?

Заранее спасибо!

8
задан casperOne 28 July 2012 в 17:55
поделиться