JAXB - Бобы для XSD или XSD для бобов? - PullRequest
8 голосов
/ 20 марта 2010

У меня есть существующая модель данных. Я хотел бы выразить эту модель данных в терминах XML.

Похоже, у меня есть два варианта использования JAXB:

  • Создайте XSD, который отражает мою модель данных, и используйте xjc для создания объектов привязки. Маршаллинг и демаршаллинг будут включать создание «отображающего» класса, который будет брать мои существующие объекты данных и сопоставлять их с объектами, созданными xjc. Например, в моей модели данных у меня есть класс Doc, и JAXB создаст другой класс Doc с в основном такими же точными полями, и мне придется сопоставить класс Doc с классом DOC xjc.
  • Аннотируйте мою существующую модель данных аннотациями JAXB и используйте schemagen для генерации XSD из моих аннотированных классов.

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

Я склонен начать с XSD в первую очередь, но кажется странным, что мне нужно написать и поддерживать отдельный класс отображения, который перемещает данные между моим миром и миром JAXB.

Есть рекомендации?

Ответы [ 5 ]

6 голосов
/ 28 июня 2010

Генерирование XSD из существующих классов звучит для меня как самый безопасный путь.

Однако, мне кажется, что если вы не знаете JAXB хорошо, то подход к аннотированию ваших собственных классов может оказаться крайне разочаровывающим (как с болью, так и со временем :)).

Это произошло со мной в связанном контексте, когда я попытался вручную извлечь суперкласс из классов, сгенерированных JAXB, а затем перенаправить экземпляры в XML. Я получал различные (загадочные) исключения JAXB. Правда, мои знания JAXB еще не настолько глубоки.

Если вы настаиваете на использовании JAXB, то я предлагаю рассмотреть возможность использования первого подхода (XSD + XJC) в качестве способа получения начальных аннотаций JAXB для ваших классов.

Вы можете использовать XSD + XJC, чтобы получить представление о том, как комментировать свои собственные классы. Тогда вы можете попробовать и разместить на них правильные аннотации. Начните с более сложных классов (ссылок, наследования, списка ссылок, списка ссылок на абстрактный базовый класс) в самом начале.

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

Если цель этих усилий состоит в том, чтобы также иметь возможность маршалировать экземпляры в XML, то я предлагаю следить за JAXBElement. В некоторых случаях (которые я не могу точно указать из-за недостатка знаний) экземпляры не будут маршалировать, если они не заключены в элемент JAXBElement.

Мы используем HyperJAXB для генерации уровня персистентности на основе набора XSD. Сгенерированные классы также используются для маршалинга. У нас есть много «веселья», заставляя это работать, особенно. из-за IDREF и JAXBElement.

2 голосов
/ 05 июля 2010

Читая между строк, я считаю, что верно следующее:

  1. У вас есть желаемая объектная модель.
  2. У вас есть желаемая XML-схема или, по крайней мере, довольно хорошее представление о том, как вы хотите, чтобы она выглядела.

Этот сценарий обычно называется отображением "встретиться посередине". Это только частично решено JAXB. К счастью, поскольку JAXB является спецификацией, есть другие реализации, такие как EclipseLink JAXB (MOXy), которые вы можете использовать.

MOXy предлагает расширение отображения на основе XPath, которое позволяет вам отображать между вашей моделью Java и желаемой схемой XML:

1 голос
/ 20 марта 2010

Вы в значительной степени в худшей возможной отправной точке для JAXB. С вашей позиции, я думаю, JiBX может быть лучше, он может генерировать схему из модели без аннотаций классов, а затем связывать XML обратно с объектной моделью во время выполнения, без использования аннотаций.

1 голос
/ 23 июня 2010

Решение, с которым мы пошли, состоит в том, чтобы иметь отдельный проект, содержащий все модели данных, определенные схемами xml, из которых Java-классы получены с использованием JAXB. Другие проекты, использующие модели данных, зависят от этого пакета схем.

Таким образом, все «контракты» между проектами определяются в одном месте с использованием удобного переносимого представления xsd. Нет необходимости в каких-либо классах отображения, потому что мы просто напрямую используем сгенерированные JAXB.

1 голос
/ 20 марта 2010

Вы можете использовать xjc и при этом иметь только один класс с аннотациями XML, который будет использоваться в качестве объекта данных. Но это на тот случай, если вы не создаете заново классы для каждой сборки.

И поскольку, на мой взгляд, генерация кода относится к вопросу о том, с чего начать, я бы предложил начать с занятий. Потому что если у вас есть ваши классы в качестве отправной точки, вам никогда не нужно будет заново генерировать эти классы. Со временем ваши классы начинают расти, включая @XmlTransient, наследование, вспомогательные методы и другие (JPA) аннотации.

...