Java в XSD или XSD в Java

Я знаю, что с помощью JAXB вы можете генерировать файлы Java из XSD и что вы также можете генерировать XSD из аннотированных POJO. Каковы преимущества и недостатки каждого из них? Один в целом лучше другого?

В основном мы хотим сериализовать события в журнал в формате XML.


person Paul Reiners    schedule 17.10.2012    source источник


Ответы (4)


В конечном счете, это зависит от того, на чем вы хотите сосредоточиться:

Если XML-схема важнее всего

Тогда лучше всего начать со схемы XML и сгенерировать модель JAXB. Есть детали XML-схемы, которую реализация JAXB (JSR-222) просто не может сгенерировать:

  • Значение maxOccurs, отличное от 0, 1 или неограниченное
  • много граней на простом типе
  • группы моделей

Если объектная модель важнее всего

Если вы будете использовать модель Java не только для преобразования между объектами и XML (т. е. использовать ее с JPA для сохраняемости), я бы рекомендовал начать с объектов Java. Это даст вам максимальный контроль.

person bdoughan    schedule 17.10.2012
comment
Мы используем JAXB для передачи данных в веб-службы REST и обратно. Иногда у нас уже могут быть доступные bean-компоненты/DTO, которые мы можем использовать для создания XSD. Иногда мы будем начинать с нуля и создавать эти bean-компоненты. Я предполагаю, что наша объектная модель — самое важное в этих случаях, вы согласны? XSD будет использоваться не более чем на этапе создания объектов для передачи данных. - person medloh; 17.09.2014

Это зависит от ваших требований и сценария относительно точки инициации.

Учитывая ваше требование, используйте generate Java files from an XSD, поскольку вы хотите сначала определить формат вывода (XML), который должен поддерживаться Java.,

person Yogendra Singh    schedule 17.10.2012

Учитывая, что одним из основных моментов XML является переносимость формата передачи данных, которую можно использовать независимо от платформы или языка, я бы, как правило, избегал создания XSD на каком-либо конкретном языке программирования. Это может не иметь значения, если вы знаете, что обмениваетесь данными только между конечными точками Java (но уверены ли вы, что это будет верно навсегда?).

Лучше, при прочих равных, определять интерфейс/схему нейтральным к языку программирования способом.

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

person DNA    schedule 17.10.2012
comment
В XML-схеме, созданной реализацией JAXB (JSR-222), нет ничего специфичного для Java. - person bdoughan; 18.10.2012
comment
Хорошо. Однако, по моему опыту, часто получается совсем другая схема, если начинать с языка программирования, чем если начинать с XSD, из-за разных стилей и особенностей языков. Начиная с редактора схем, также имеет тенденцию создавать другие проекты (лучше факторизованные, но менее читабельные), чем если вы начинаете с примера XML, а затем выполняете обратное проектирование схемы на его основе. - person DNA; 18.10.2012
comment
Я видел хорошо разработанные, созданные вручную и действительные схемы, которые хорошо импортируются JAXB, но не могут генерировать классы для .NET 4. Однако я никогда не видел, чтобы это происходило со схемами, созданными из классов JAXB. Вы, конечно, правы, что подход склонен давать разные схемы. В частности, глубоко структурированный XML дает pojos, которые сложно создавать с нуля в коде. - person Petter Nordlander; 18.10.2012
comment
Предположительно, схемы, сгенерированные из POJO, могут иметь ту же проблему (т. е. если .NET не соответствует стандарту, почти любой не-.NET подход к генерации схемы не гарантирует взаимодействия с ним)? - person DNA; 18.10.2012
comment
Теоретически да. Но на практике мой опыт связан с повторным использованием ссылок. Никогда еще не видел, чтобы JAXB генерировал эту проблему. - person Petter Nordlander; 18.10.2012

Если у вас есть возможность спроектировать как pojo, так и схему, это вопрос дизайна - вы разрабатываете «идеальную» схему или «идеальный» класс Java.

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

person Petter Nordlander    schedule 17.10.2012