Рабочий процесс JAXB - как вы переходите на использование JAXB - PullRequest
8 голосов
/ 05 августа 2010

Документация JAXB похожа на учебник, и мне просто не нужно время, чтобы изучать все JAXB, прежде чем мне нужно его использовать.

У меня есть XSD, если я хочу использовать JAXB для маршалирования и демаршализации, каков рабочий процесс?

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

Что я уже знаю: 1. JAXB может использоваться для получения объектов и создания XML-документов из них и наоборот. 2. Он использует какой-то загадочный инструмент под названием "XJC", который я не смог найти где-либо на их сайте. 3. XJC создает классы для вас на основе XSD

Во-первых, как мне найти XJC? На самом деле я знаю, что он установлен в моей системе, но не знаю, откуда я его взял.
Во-вторых, каким бы ни был этот инструмент и как он попал на мою машину, как мне заставить его работать с самой последней версией JAXB? В-третьих, поэтому, если мои изменения XSD действительно нужно воссоздать весь объект Java, следовательно, возможно ли сделать все мои тесты недействительными? Или я могу определить объект в сопоставлениях XSD, чтобы контролировать отображение, а не генерацию кода по умолчанию?

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

Ответы [ 2 ]

15 голосов
/ 05 августа 2010

Если у вас есть JDK6;

xjc находится в папке bin / вашего JDK, что-то вроде C: \ Program Files (x86) \ Java \ jdk1.6.0_20 \ bin \ xjc.exe

JDK поставляется с jaxb, хотя могут быть более новые версии, начиная с http://jaxb.java.net/ или других доступных реализаций, вам, вероятно, не нужно беспокоиться об этом на данный момент.

JAXB может делать много вещей, я не совсем уверен, что именно вы пытаетесь достичь.Если у вас есть xsd, вы можете сгенерировать из него java-классы, запустив, например,

xjc -p com.mypackage myschema.xsd

и включить сгенерированные классы в ваш проект (как правило, вы запускаете его как часть процесса сборки).

Или я могу определить объект для сопоставления XSD, чтобы я мог контролировать сопоставление, а не генерацию кода по умолчанию?

Сгенерированные классы - это просто pojos с некоторымианнотации, вы можете создать эти классы самостоятельно и полностью контролировать отображение с помощью аннотаций.

Как уже говорилось, jaxb может делать много вещей, вот лишь несколько основных примеров, SearchParam / SearchType - это класс, сгенерированныйxjc из небольшого пользовательского файла .xsd

Сериализация объекта в файл XML

JAXBContext context = JAXBContext.newInstance(SearchParam.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
List<String> hours = new LinkedList<String>();
hours.add("2009.12.11");
hours.add("2009.12.13");

SearchParam param = new SearchParam();
param.setFilter("greater");
param.setHours(hours);
param.setSearchType(SearchType.Fuzzy);
marshaller.marshal(param, new FileWriter("/tmp/SearchParam.xml"));    

Десериализация файла XML

 JAXBContext context = JAXBContext.newInstance(SearchParam.class);
 Unmarshaller unMarshaller = context.createUnmarshaller();
 SearchParam param = (SearchParam) unMarshaller.unmarshal(
                    new FileInputStream("/tmp/SearchParam.xml"));

Десериализацию и проверку схемы

JAXBContext context = JAXBContext.newInstance(SearchParam.class);
Unmarshaller unMarshaller = context.createUnmarshaller();
Schema schema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI)
                 .newSchema(new  File("/tmp/schema1.xsd"));
unMarshaller.setSchema(schema);
SearchParam param = unMarshaller.unmarshal(
                      new FileInputStream("/tmp/SearchParam.xml"));

Дополнительная информация

1 голос
/ 05 августа 2010

Скорее всего, у вас уже установлен XJC. Проверьте каталог bin вашей установки JDK 6. Найденный, если вы просто запустите XJC, он выдаст вам параметры командной строки.

JAXB - это спецификация, поэтому существует несколько реализаций:

  • Metro (RI), релизы тесно связаны с обновлениями JDK, поэтому, если у вас есть недавний JDK, вы должны быть хорошими.
  • MOXy JAXB, часть EclipseLink доступна здесь, http://www.eclipse.org/eclipselink/moxy.php

Если вы измените свою схему, вы сможете настроить объектную модель, особенно с помощью расширений MOXy.

Для начала посмотрите: http://wiki.eclipse.org/EclipseLink/Examples/MOXy/GettingStarted

...