2009-09-08 4 views
3

У меня есть серия сообщений xml, все с их собственными схемами и пространствами имен. Сообщения в настоящее время сортируются с использованием JAXB (мы все еще живем в среде Java 1.4), и у нас есть большой код устаревшего кода с использованием этого кода JAXB, поэтому любое решение должно быть минимально навязчивым.Как настроить jaxb-генерацию?

Проблема заключается в том, что, хотя каждое сообщение имеет набор общих тегов заголовков, пространство имен охватывает все сообщение и, следовательно, делает заголовок для каждого сообщения уникальным. В результате «общие» секции заголовков загружаются в версии с ограниченным пространством имен, используя общий класс, который реализуется с использованием очень уродливых классов прокси и кода динамического отражения. Этот общий класс был идентифицирован как источник некоторых проблем с производительностью.

В идеале я хочу осуществить замену, используя следующие:

  • Используйте Maven2, чтобы заменить текущий процесс сборки ручной JAXB.
  • Создайте одноразовые классы JAXB для «обычных» заголовков, которые будут использоваться повторно в каждом сообщении.
  • Преобразование текущих динамических/прокси-классов для использования вышеуказанных конкретных классов заголовков.
  • Создайте классы JAXB для секции unqiue каждого сообщения.

К сожалению, у меня нет контроля над структурой сообщений, иначе я бы посмотрел на создание отдельного пространства имен заголовка. Я думал о запуске XSLT-преобразования, чтобы «переименовать» пространство имен заголовков после сортировки и до отмены отмены, но я предпочел бы избежать дополнительной загрузки, если это возможно, даже если это означает более сложную сборку.

Является ли это тем, что я хочу сделать, или я пропустил что-то фундаментальное? Есть ли какие-либо намеки о том, как реализовать? Плагины и т. Д.?

Добавление 1: Связывание с использованием javaType будет делать эту работу, но оказывается, что не работает для сложных типов.

Добавления 2: Связывание с использованием класса почти делает это так хорошо, но я хотел бы, чтобы это указать конкретный класс и пакета, чтобы я мог игнорировать сгенерированные дубликаты.

ответ

1

JAXB 2.x содержит аннотацию @XmlJavaTypeAdapter, которая может быть решением вашей проблемы (см. this blog от Kohsuke Kawaguchi).

Вы можете сопоставить свой общий класс заголовка с генерируемыми классами заголовков пространства имен с реализацией XmlAdapter<XMLHeaderFromNamespaceX, CommonHeader> и использовать адаптер с XmlJavaTypeAdapter.

Однако в качестве недостатка вам понадобится адаптер для каждого из ваших конкретных пространств имен.

+0

Я заметил это, но у него есть предпосылка Java 1.5, и я застрял с 1.4 на данный момент. –

+0

А, прости, я пропустил это. – janko

+0

Это далеко не идеальный, но если вы все еще на самом деле застряли, вы можете попробовать использовать это, а затем ретротрансляции аннотаций в банке jaxb-api – GaZ