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

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

Но в большинстве случаев нам требуется получить от Response тот объект, который был отправлен веб-службой в стиле REST. Метод readEntity считывает входной поток данных сообщения, как экземпляр указанного класса Java. Для этого используется интерфейс MessageBodyReader, поддерживающий отображение потока данных сообщения на требуемый тип. Таким образом, если вы укажете, что вам нужна строка (String), то среда времени исполнения JAX-RS применит действующий по умолчанию считыватель строк:

>String body = response.readEntity(String.class);

Когда метод readEntity() вызывается с POJO, среде времени исполнения JAX-RS требуется интерфейс MessageBodyReader, определяющий тип содержимого ответа путем сопоставления. Например, если Book представляет собой компонент JAXB, а ваше содержимое относится к типу XML, то JAX-RS делегирует среде исполнения JAXB демаршалинг потока данных XML в POJO Book:

>Book book = response.readEntity(Book.class);

Объединяя все вышеизложенное, следующий код вызывает удаленную веб-службу в стиле REST и получает возвращенную строковую сущность:

>Response response = 

>····ClientBuilder.newClient(). target("http://www.myserver.com/book") 

>·····························.request(). get();

>String body = response.readEntity(String.class);

Но в методе GET предусмотрен сокращенный вариант записи, позволяющий указать желаемый тип и получить объект всего в одной строке кода (без использования объекта Response в качестве посредника):

>String body =

>····ClientBuilder.newClient(). target("http://www.myserver.com/book") 

>·····························.request(). get(String.class);

Структура потребителя REST

В отличие от JAX-WS, встроенного в Java SE и обеспечивающего вызов готовых веб-служб SOAP при наличии одного лишь JDK, при работе с JAX-RS необходимо указывать в пути к классу клиентский API. Но это единственное ограничение. В отличие от применения SOAP здесь вам не придется генерировать никаких артефактов. Поэтому потребители веб-служб в стиле REST могут происходить откуда угодно — как из любого класса Java, работающего на виртуальной машине JVM (основной класс, интеграционный тест, пакетная обработка), так и из любого компонента Java EE, работающего в контейнере (сервлет, EJB, управляемый компонент).

Разумеется, одна из сильных сторон веб-служб в стиле REST — их интероперабельность. Так, если вы разместите в Интернете набор ресурсов, то сможете обращаться к ним и с мобильных устройств (смартфоны, планшеты), и с помощью других веб-технологий (скажем, JavaScript).

Все вместе

Объединим все концепции, разобранные выше в этой главе, напишем веб-службу в стиле REST для работы с информацией о книгах, упакуем ее и развернем в GlassFish. Затем протестируем, воспользовавшись для этого cURL и интеграционным тестом (применим новый клиентский API). Наша цель — получить JAXB-компонент Books, представляющий собой список JPA-сущностей Book, отображаемых на базу данных. Служба BookRestService обеспечивает выполнение CRUD-операций над информацией о книге. Несмотря на то что это веб-служба с передачей состояния представления, она также является сеансовым компонентом и допускает разграничение транзакций (с применением менеджера сущностей). Выполнив развертывание, вы сможете создавать, получать или удалять записи о книгах, пользуясь HTTP-методами с помощью cURL и клиентского API JAX-RS. Благодаря JAXB и расширению Jersey вы сможете получить по два варианта представления этих книг — в XML и в JSON.

В данном примере структура каталогов строится по принципу, принятому в Maven. Все классы упаковываются в архив WAR (chapter15-service-1.0.war). Классы, показанные на рис. 15.4, должны находиться в следующих каталогах и файлах:

• src/main/java — каталог для Books, сущности Book и BookRestService, а также для классов, используемых для конфигурирования среды времени исполнения (подробнее о ApplicationConfig мы поговорим ниже);

• src/main/resources — включает файл persistence.xml, используемый ресурсом, отображающим объект Book на базу данных Derby;

• src/test/java — каталог для интеграционного теста BookRestServiceIT;

• pom.xml — объектная модель проекта Maven (POM), описывающая проект и его зависимости.


Рис. 15.4. Все вместе

Написание сущности Book

Теперь вы уже понимаете код сущности Book, но остается отметить еще один важный момент: данная сущность также сопровождается аннотацией JAXB @XmlRootElement (листинг 15.20). Благодаря этому сущность может иметь XML-представление книги.


Листинг 15.20. Сущность Book с аннотацией JAXB

>@Entity

>@XmlRootElement

>@NamedQuery(name = Book.FIND_ALL, query = "SELECT b FROM Book b")

>public class Book {


>··public static final String FIND_ALL = "Book.findAll";


>··@Id

>··@GeneratedValue

>··private String id;

>··@Column(nullable = false)

>··private String title;

>··private Float price;

>··@Column(length = 2000)

>··private String description;

>··private String isbn;

>··private Integer nbOfPage;

>··private Boolean illustrations;


>··// Конструкторы, геттеры, сеттеры

>}

Эта сущность также может быть упакована с файлом persistence.xml (здесь он опущен ради упрощения примера).

Написание JAXB-компонента Books


Рекомендуем почитать
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 так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.