Изучаем Java EE 7 - [191]

Шрифт
Интервал

• класс Unmarshaller, который преобразует XML-документ в граф объектов и, возможно, проверяет XML;

• класс Marshaller, который принимает граф объектов и трансформирует его в документ XML.

Например, чтобы преобразовать наш объект CreditCard в документ XML (листинг 12.10), следует использовать метод Marshaller.marshal(). Этот метод принимает в качестве параметра объект и выполняет операцию маршалинга; конечный тип объекта может быть разным (StringWriter будет хранить строковое представление документа XML, а FileOutputStream сохранит его в файл).


Листинг 12.10. Класс Main, выполняющий маршалинг объекта CreditCard

>public class Main {


>··public static void main(String[] args) throws JAXBException {


>····CreditCard creditCard = new CreditCard("1234", "12/09", 6398, "Visa");

>····StringWriter writer = new StringWriter();


>····JAXBContext context = JAXBContext.newInstance(CreditCard.class);

>····Marshaller m = context.createMarshaller();

>····m.marshal(creditCard, writer);


>····System.out.println(writer.toString());

>··}

>}

Данный код создает экземпляр типа JAXBContext с помощью статического метода newInstance(), которому передается корневой класс, для которого необходимо выполнить маршалинг (CreditCard.class). Из созданного объекта Marshaller затем вызывается метод marshal(), который генерирует XML-представление (см. листинг 12.8) объекта, представляющего информацию о кредитной карте, в объект типа StringWriter и отображает его. Такой же подход можно применить для демаршалинга XML-документа в объект с помощью метода Unmarshaller.unmarshal().

Metro, пример реализации JAXB, имеет и другие инструменты, в частности компилятор схем (xjc) и генератор схем (schemaGen). Хотя маршалинг/демаршалинг работает с объектами и XML-документами, компилятор и генератор схем работают с классами и XML-схемами. Эти инструменты можно использовать из командной строки (поставляются в комплекте с Java SE 7) или как цель Maven.

Аннотации

JAXB во многом похож на JPA. Тем не менее вместо преобразования объектов в форму, пригодную для записи в базу данных, JAXB выполняет преобразование в XML-документ. Кроме того, как и JPA, JAXB определяет набор аннотаций (в пакете javax.xml.bind.annotation), позволяющих настроить такое преобразование, и зависит от конфигурации с помощью исключений для минимизации работы разработчика. Если постоянные объекты должны иметь аннотацию @Entity, в JAXB ее аналогом является @XmlRootElement (листинг 12.11).


Листинг 12.11. Пользовательский класс CreditCard

>@XmlRootElement

>@XmlAccessorType(XmlAccessType.FIELD)

>public class CreditCard {


>··@XmlAttribute(required = true)

>··private String number;

>··@XmlElement(name = "expiry-date", defaultValue = "01/10")

>··private String expiryDate;

>··private String type;

>··@XmlElement(name = "control-number")

>··private Integer controlNumber;


>··// Конструкторы, методы работы со свойствами

>}

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


Листинг 12.12. Схема кредитной карточки с атрибутами и значениями по умолчанию

>

>


>··


>··

>····

>······

>······

>······

>····

>····

>··

>

С помощью объекта Marshaller вы можете легко получить XML-представление объекта CreditCard (см. листинг 12.10). Корневой элемент представляет объект CreditCard и включает в себя значение каждого атрибута.

JAXB дает возможность настраивать и управлять этой структурой XML. Документ XML состоит из элементов (Значение) и атрибутов (). JAXB использует две аннотации, чтобы их различать: @XmlAttribute и @XmlElement. Каждая аннотация имеет набор параметров, который позволяет вам переименовать атрибут, разрешить или запретить указывать пустые значения, назначить значения по умолчанию и т. д. Свойства класса преобразуются в XML-элементы по умолчанию, если они не имеют аннотации @XmlAttribute.

В примере, приведенном выше (см. листинг 12.11), эти аннотации используются, чтобы включить номер кредитной карты в атрибут (а не в элемент) и изменить срок истечения карточки и контрольное число. Этот класс будет преобразован в другую схему, в которой номер кредитной карты представлен в виде обязательного атрибута , а срок истечения карточки изменяется на значение по умолчанию 01/10 (см. листинг 12.12).


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

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


Симуляция частичной специализации

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


Обработка событий в С++

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


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.