Рабочий процесс JAXB — как начать использовать JAXB

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

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

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

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

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

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


person walnutmon    schedule 04.08.2010    source источник


Ответы (2)


Предполагая, что у вас есть 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"));

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

person nos    schedule 04.08.2010
comment
Во-первых, отличный ответ, оценил. Вопрос: Как вы обычно создаете объекты Java, а затем просто копируете их и вставляете в свой проект? Вы говорите, что это часто будет частью сценария сборки, но мне это кажется обратным, потому что тогда как вы узнаете, что код, который вы пишете, который использует эти объекты, будет скомпилирован, а тем более работать, как ожидалось? Кроме того, такие вещи, как автозаполнение, не могут работать, потому что объекты не существуют, пока вы не создадите проект. - person walnutmon; 05.08.2010
comment
Конечно, копирование/вставка сгенерированного кода — это нормально, но недостатком является то, что вы просто должны помнить об этом при изменении схемы. Если вы делаете это как часть своей сборки, автозаполнение будет работать нормально, вам просто нужно сначала запустить сборку один раз. Независимо от того, компилируется ли ваш проект и работает ли он так, как ожидалось, это ничем не отличается от запуска xjc вручную, и у вас может быть модульный тест, обнаруживающий большинство таких ошибок. - person nos; 05.08.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

person bdoughan    schedule 04.08.2010