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

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

Что нового в JAX-RS 2.0

Спецификация JAX-RS 2.0 (запрос на спецификацию JSR 339) — это основной релиз, сосредоточенный на интеграции с платформой Java EE 7 и ее новыми возможностями. К числу основных новых возможностей JAX-RS 2.0 относятся:

• клиентский API, отсутствовавший во всех технических версиях JAX-RS 1.x, поэтому в каждой реализации применялся свой собственный проприетарный API. JAX-RS 2.0 ликвидирует этот пробел благодаря низкоуровневому API для выстраивания запросов;

• в JAX-RS 2.0 появились фильтры и перехватчики, напоминающие обработчики SOAP или перехватчики управляемых компонентов. Поэтому теперь вы можете перехватывать запрос и ответ и обрабатывать их, как вам требуется;

• появился новый механизм асинхронной обработки, который позволяет внедрять интерфейсы для длинного опроса или реализовывать отправку данных по инициативе сервера;

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

В табл. 15.4 перечислены основные пакеты, определенные в спецификации JAX-RS.


Таблица 15.4. Основные пакеты JAX-RS
ПакетОписание
javax.ws.rsВысокоуровневые интерфейсы и аннотации, используемые для создания веб-служб с передачей состояния представления
javax.ws.rs.clientКлассы и интерфейсы нового клиентского API JAX-RS
javax.ws.rs.containerКонтейнер-специфичный API JAX-RS
javax.ws.rs.coreНизкоуровневые интерфейсы и аннотации, используемые для создания веб-ресурсов с передачей состояния представления
javax.ws.rs.extAPI, предоставляющие расширения для типов, поддерживаемых в JAX-RS API

Справочная реализация

Справочная реализация JAX-RS называется Jersey. Это свободный проект, который одновременно подчиняется двум лицензиям: CDDL и GPL. Jersey также предоставляет специальный API для расширения самой Jersey.

Существуют и другие реализации JAX-RS, в частности CXF (Apache), RESTEasy (JBoss) и Restlet (сравнительно старый проект, появившийся еще до того, как была завершена подготовка спецификации JAX-RS).

Написание веб-служб с передачей состояния представления

Здесь обсуждались некоторые настолько низкоуровневые концепции (взять хотя бы протокол HTTP), что у вас вполне могли накопиться самые разные предположения о том, как может выглядеть код при разработке веб-службы в стиле REST. Начнем с хорошего: вам не придется ни писать служебный код для переваривания HTTP-запросов, ни генерировать HTTP-ответы вручную. JAX-RS — это очень красивый API, позволяющий описать веб-службу с передачей состояния представления с помощью всего нескольких аннотаций. Веб-службы в стиле REST — это обычные POJO, имеющие минимум один метод, аннотированный javax.ws.rs.Path. В листинге 15.3 показан типичный ресурс такого рода.


Листинг 15.3. Простая веб-служба в стиле REST для работы с информацией о книгах

>@Path("/book")

>public class BookRestService {

>··@GET

>··@Produces("text/plain")

>··public String getBookTitle() {

>····return "H2G2";

>··}

>}

BookRestService — это класс Java, аннотированный @Path. Это означает, что путь к ресурсу будет лежать через путь URI /book. Метод getBookTitle() помечен как предназначенный для обработки HTTP-операций GET (на это указывает аннотация @GET). Данный метод генерирует текст (MIME-тип такого содержимого — text/plain; я также мог бы воспользоваться константой MediaType.TEXT_PLAIN). Для доступа к этому ресурсу вам понадобится HTTP-клиент, например браузер, в котором можно открыть URL http://www.myserver.com/book.

Спецификация JAX-RS является по своей природе HTTP-ориентированной и имеет несколько четко определенных классов и аннотаций для работы с HTTP и URI. Ресурс может включать несколько представлений, поэтому API обеспечивает поддержку разнообразных типов содержимого, а также использует JAXB для маршалинга и демаршалинга XML-представлений в объекты и обратно. JAX-RS также не зависит от контейнера. Поэтому развертывание ресурсов можно выполнять в GlassFish и во многих других сервлетных контейнерах.

Структура веб-службы с передачей состояния представления

Из листинга 15.3 понятно, что REST-служба не реализует никаких интерфейсов, а также не расширяет какого-либо класса. Единственная обязательная аннотация, нужная для превращения POJO в REST-службу, — это @Path. JAX-RS работает на основе «конфигурации по исключениям», то есть располагает набором аннотаций для конфигурирования стандартного поведения. Ниже перечислены требования для написания REST-службы:

• класс должен быть аннотирован с помощью @javax.ws.rs.Path (в JAX-RS 2.0 отсутствует XML-эквивалент метаданных, поскольку нет дескриптора развертывания);

• класс должен быть определен как общедоступный (публичный), при этом не должен быть ни финальным, ни абстрактным;

• классы корневых ресурсов (имеющие аннотацию @Path) должны иметь действующий по умолчанию общедоступный конструктор. Классы некорневых ресурсов не требуют такого конструктора;

• класс ни в коем случае не должен определять метод finalize();

• для добавления возможностей EJB к REST-службе класс должен иметь аннотацию @javax.ejb.Stateless или @javax.ejb.Singleton (см. главу 7);


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