2010-08-04 2 views
8

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

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

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

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

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

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

ответ

15

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

XJC в бункерном/папке 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"));  

Deserialize файл XML

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

Deserialize и сделать проверку схемы

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")); 

Больше информации

+0

Во-первых, большой ответ, оценили его. Вопрос: Как вы обычно создаете объекты java, а затем просто скопируйте их в свой проект? Вы говорите, что это часто будет частью сценария сборки, но это кажется мне обратным, потому что тогда как вы узнаете, что код, который вы пишете, который использует эти объекты, будет компилироваться, а тем более бегать, как ожидалось? Кроме того, такие вещи, как автозаполнение, не могут работать, потому что объекты не существуют до тех пор, пока вы не создадите проект. – walnutmon

+0

Конечно, «копировать/вставлять» сгенерированный код в норму - недостаток - это вы просто должны помнить, когда это происходит при изменении схемы. Если вы сделаете это как часть своей сборки, автозаполнение будет работать нормально, вы просто должны сначала запустить сборку. Независимо от того, компилируется или работает ваш проект в ожидании, ничем не отличается от запуска xjc «вручную», и у вас может быть блок-тест, улавливающий большинство таких ошибок. – nos

1

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

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

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

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

Для начала видеть: http://wiki.eclipse.org/EclipseLink/Examples/MOXy/GettingStarted

Смежные вопросы