REST (REpresentational State Transfer, передача состояния представления) является архитектурным стилем для распределенных систем данных гипермедиа, например, World Wide Web. В основе архитектуры RESTful лежит принцип определения ресурсов по универсальным идентификаторам ресурсов (Universal Resource Identifiers, URI). Управление этими ресурсами осуществляется с помощью стандартного интерфейса, например HTTP, а обмен информацией происходит с помощью представлений этих ресурсов. В данном учебном курсе рассматривается архитектурный стиль REST и поддержка этого стиля в среде IDE NetBeans.
Важно! Для работы с проектами Java EE 6 необходим Tomcat 7.x или GlassFish Server 3.x, или Oracle WebLogic Server 12c.
Введение
Веб-службы RESTful представляют собой службы, созданные с помощью архитектурного стиля RESTful. Создание веб-служб с применением подхода RESTful становится популярной альтернативой использованию технологий развертывания служб в сети Интернет на основе SOAP, поскольку этот подход отличается простотой и удобством, а также предоставляет возможность передачи данных непосредственно по HTTP.
Среда IDE поддерживает быструю разработку веб-служб RESTful при помощи JSR 311 (интерфейса API Java для веб-служб RESTful (JAX-РТС)) и Jersey (примера реализации JAX-РТС).
Для получения более подробных данных обратитесь к разделу
Помимо создания веб-служб RESTful среда IDE также поддерживает тестирование, создание клиентских приложений с возможностью доступа к веб-службам RESTful и создание кода для вызова веб-служб (как RESTful, так и служб на основе SOAP).
Ниже приведен список возможностей RESTful, предоставляемых средой IDE:
быстрое создание веб-служб RESTful на основе классов объектов JPA и шаблонов;
быстрое создание кода для вызова веб-служб, таких как Карты Googlе, Yahoo! News Search и StrikeIron, путем перетаскивания компонентов из диспетчера веб-служб в окно служб;
создание клиентов Java RESTful для служб, зарегистрированных в диспетчере веб-служб;
создание тестовых клиентов для тестирования веб-служб RESTful;
логическое представление для удобного перехода по классам реализации веб-службы RESTful в проекте;
полностью интегрированная платформа Spring с возможностью обработки транзакций Spring.
В этом учебном курсе рассматривается создание, реализация и тестирование веб-служб RESTful при помощи среды IDE.
Веб-службы RESTful в Java используют интерфейс API сохранения состояния Java для связи с базами данных. Говоря конкретнее, веб-службы RESTful используют классы сущностей и блок сохранения состояния как они определены в интерфейсе API сохранения состояния. Классы сущностей – это классы Java, сопоставленные с объектами в реляционной базе данных. Согласно руководству по Java EE5: "Сущностью называется упрощенный объект области сохранения состояния. Как правило, сущность представляет таблицу в реляционной базе данных, и каждый экземпляр сущности соответствует строке в этой таблице. Блок сохранения состояния состоит из набора сущностных классов, источника данных, поставщика сохранения состояния и собственного имени блока сохранения состояния, как определено в файле persistence.xml.
Среду IDE NetBeans можно использовать как для создания классов сущностей и веб-служб RESTful в одном процессе, так и для создания веб-служб RESTful из существующих классов сущностей. В этом учебном курсе мы используем мастер создания служб RESTful из базы данных для автоматического создания классов сущностей и веб-служб RESTful в одном процессе. Мастер автоматически создаст блок сохранения состояния.
Использование сервера баз данных MySQL
Если использовать сервер базы данных MySQL вместо JavaDB (Derby), необходимо зарегистрировать сервер базы данных в среде IDE и добавить базу данных sample к серверу.
Чтобы использовать сервер базы данных MySQL с этим учебным курсом, выполните следующие действия.
Зарегистрируйте сервер MySQL в среде IDE, если он еще не зарегистрирован. Чтобы зарегистрировать сервер MySQL, перейдите к окну Services ("Службы") среды IDE, щелкните правой кнопкой мыши узел Databases ("Базы данных") и выберите Register MySQL Server ("Зарегистрировать сервер MySQL").
Откроется диалоговое окно, в которое следует ввести параметры своего сервера MySQL, включая имя и пароль пользователя, являющегося администратором. См. раздел "Настройка свойств сервера MySQL" в разделе Подключение к базе данных MySQL.
Щелкните правой кнопкой мыши узел сервера MySQL и выберите Create Database ("Создать базу данных"). Откроется диалоговое окно создания базы данных MySQL.
Введите sample в качестве имени новой базы данных. Предоставьте полный доступ корневому пользователю или пользователю по своему выбору.
Нажмите кнопку "ОК". Откроется диалоговое окно, сообщающее, что именем примера базы данных является sample и спрашивающее, следует ли создать таблицы, объекты и данные для этой базы данных.
Нажмите кнопку "Да". Среда IDE создаст и заполнит базу данных, а также добавит подключение к ней.
Создание веб-служб RESTful из базы данных
Целью данного упражнения является создание проекта, а затем создание классов сущностей и веб-служб RESTful из базы данных.
В данном разделе используется база данных JavaDB (Derby) и источник данных jdbc/sample. JavaDB входит в состав SDK. Источник jdbc/sample автоматически создается средой IDE NetBeans при установке среды IDE вместе с GlassFish.
Создание проекта
Для создания веб-служб RESTful нужен проект веб-приложения Java.
Для создания проекта выполните следующие действия:
Выберите File ("Файл") > New Project ("Создать проект") (Ctrl-Shift-N на Linux и Windows, ⌘-Shift-N на MacOS). В области "Категории" выберите "Java Web". В области "Projects" выберите "Web Application". Нажмите кнопку Next ("Далее"). Откроется мастер создания веб-приложений.
Как вариант, можно создать веб-приложение Maven. Выберите File ("Файл") > New Project ("Создать проект") (Ctrl-Shift-N на Linux и Windows, ⌘-Shift-N на MacOS). В Categories ("Категории) выберите Maven. В Projects ("Проекты") выберите Maven Web Application ("Веб-приложение Maven") и нажмите кнопку Next ("Далее").
Введите в поле "Имя проекта" текст CustomerDB. Нажмите кнопку "Далее".
Выберите "EE 6" или "EE 5". В окне сервера выберите сервер, который следует использовать, но обратите внимание, что проектам EE 6 требуется сервер GlassFish версии 3 или последующих. Пройдите по остающимся параметрам, не меняя их, и нажмите кнопку Finish ("Готово").
Важно для проектов Maven! При создании веб-приложения Maven нельзя устанавливать сервер. Однако сервер необходимо установить перед созданием блока сохранения состояния. Поэтому после создания веб-приложения Maven откройте свойства проекта и установите сервер в Run Рroperties ("Свойства выполнения"). Чтобы открыть свойства проекта, щелкните правой кнопкой мыши узел проекта и выберите Properties ("Свойства") из контекстного меню.
Tomcat 7 и EE6. Tomcat 7 не будет работать со службами RESTful EE6, созданными средой IDE NetBeans. Это обусловлено тем, что среда NetBeans создает фасадные методы сеанса, не учитывающие состояние, в качестве служб EE6 RESTful, а у Tomcat 7 нет подключаемого модуля, поддерживающего EJB 3.1 или EJB EE6. Сведения о любых изменениях в этой области можно будет найти на соответствующих страницах проекта Apache Geronimo и проекта подключаемого модуля Apache OpenEJB.
Создание классов сущностей и служб RESTful
Когда веб-приложение Java создано, добавьте к проекту классы сущностей и веб-службы RESTful.
Для создания сущностных классов и веб-служб RESTful выполните следующие действия.
Щелкните правой кнопкой мыши узел CustomerDB и выберите New ("Создать") > Other ("Другое") > Web Services ("Веб службы") > RESTful Web Services from Database ("Веб-службы RESTful из базы данных"). На панели Database Tables ("Таблицы базы данных") откроется мастер создания веб-службы RESTful.
При использовании сервера GlassFish выберите в раскрывающемся списке "Источник данных" на панели "Таблицы" источник данных jdbc/sample.
При использовании сервера Tomcat выберите jdbc:derby://localhost:1527/sample. Если сервер базы данных Derby не запускается автоматически, необходимо запустить его на вкладке "Базы данных" в окне "Службы".
Примечание для пользователей MySQL. Необходимо будет создать новый источник данных. Выберите New Data Source ("Создать источник данных"), дайте ему произвольное описательное имя и выберите подключение к базе данных jdbc:mysql://localhost:3306/sample. Это подключение было создано при создании примера базы данных в MySQL.
Выберите в области "Доступные таблицы" таблицу CUSTOMER и нажмите кнопку "Добавить". Таблица DISCOUNT_CODE, связанная с таблицей CUSTOMER, также добавляется в область "Выбранные таблицы" автоматически. На экране должны быть представлены следующие параметры:
Нажмите кнопку Next ("Далее"). Откроется страница Entity Classes ("Классы сущностей"). В Рackage ("Пакет") введите entities. Диалоговое окно должно выглядеть следующим образом.
Примечание. Мастер создания веб-служб RESTful из баз данных автоматически создает аннотации JAXB. Если классы сущностей для приложения EE6 создаются при помощи мастера создания классов сущностей из баз данных и если позже из этих классов может потребоваться создать веб-службы RESTful, убедитесь, что установлен флажок Generate JAXB Annotations ("Создать аннотации JAXB"). Аннотации JAXB также можно вручную добавить к классам сущностей перед запуском мастера создания веб-служб RESTful из классов сущностей. Дополнительные сведения приведены в документе NetBeans to Generate Simpler RESTful Web Services ("Использование NetBeans для создания более простых веб-служб RESTful") .
Нажмите кнопку Next ("Далее"). Откроется панель "Созданные классы". В этой панели можно установить местоположение классов веб-служб RESTful, созданных для проекта средой IDE. Панель Generated Classes ("Созданные классы") для веб-служб RESTful EE5 и EE6 различается, поскольку проекты EE5 включают классы контроллера JPA, тогда как веб-службы EE6 создают классы служб как не учитывающие состояние сеансные компоненты.
Примите пакеты и расположения по умолчанию, затем нажмите кнопку Finish ("Готово"). Среда IDE создаст классы сущностей. Откроется диалоговое окно с запросом о том, как следует зарегистрировать ресурсы RESTful. В проектах EE5 можно использовать адаптер сервлета RESTful Jersey в дескрипторе развертывания web.xml (вариант по умолчанию) или написать код для собственного решения. В проектах EE6 имеется дополнительный (применяемый по умолчанию) вариант использования подкласса javax.ws.rs.core.Application.
Приложения платформы Spring: Зарегистрируйте ресурсы RESTful в дескрипторе развертывания web.xml. НЕ СЛЕДУЕТ использовать javax.ws.rs.core.Application.
Теперь среда IDE создаст веб-службы RESTful. Когда среда IDE выполнит это, загляните в окно Projects ("Проекты"). Созданные сущностные классы находятся в пакете entities. Службы находятся в пакете service. В проекте EE5 классы контроллера JPA будут находиться в пакете controller, а дескриптор развертывания web.xml в Configuration Files ("Файлы настройки").
Внимание! Среда IDE может выдать запрос Resolve Reference Problems ("Разрешить проблемы ссылок") для проекта. В этом случае щелкните правой кнопкой мыши узел проекта CustomerDB и выберите Resolve Reference Problems ("Разрешить проблемы ссылок"). Эта проблема может возникнуть, когда служба является первым приложением Jersey, запущенном на установленном экземпляре WebLogic. В этом случае среда IDE разрешит проблемы ссылок, скопировав библиотеки Jersey на сервер.
Веб-службы RESTful EE6 создают экземпляр EntityManager в каждом классе службы. Это устраняет нужду в классах контроллеров JPA и упрощает код.
Тестирование веб-служб RESTful
Целью этого упражнения является тестирование приложения.
Щелкните узел проекта правой кнопкой мыши и выберите "Тестировать веб-службы RESTful". Откроется диалоговое окно, запрашивающее, следует ли создать тестовый клиент внутри проекта службы или в другом веб-проекте Java. Это позволяет обойти ограничения безопасности в некоторых обозревателях. Можно использовать любой веб-проект, если он настроен на развертывание в том же домене сервера, что и проект CustomerDB.
Выберите, где следует создать тестовый клиент, и нажмите кнопку OK. Будет выполнен запуск сервера и развертывание приложения. По завершении развертывания приложение отобразится в обозревателе с ссылками на все веб-службы.
Если в окне вывода появилось сообщение об ошибке, указывающее на отсутствие одного или нескольких классов и невозможность построения проекта, добавьте в библиотеки компиляции библиотеки Jersey. Щелкните правой кнопкой мыши узел проекта и выберите команду "Свойства". Выберите в меню дерева "Свойства" пункт "Библиотеки". Щелкните "Добавить библиотеку" и перейдите к библиотекам Jersey.
Слева расположен набор корневых ресурсов. В этом учебном курсе им присвоены имена customers и discountCodes.
Щелкните узел customers. В диалоговом окне обозревателя отображается список параметров для тестирования службы Customers.
Возможна установка следующих параметров:
Выберите метод для тестирования. Выберите метод GET или POST и тип MIME из раскрывающегося списка.
Начало. Первая отображаемая сущность. Обратите внимание, что нумерация начинается с "0", а не с "1".
Максимум. Максимальное число выбираемых сущностей. При установке значения "0" выбираются все сущности.
Уровень развертки. Расширенная функция. Некоторые службы возвращают повторяющуюся структуру дерева иерархии. Этот параметр служит для указания глубины отображения таких иерархий в представлении необработанных данных.
Запрос. Расширенная функция. Этот параметр служит для поиска документа XML или JSON в соответствии с синтаксисом JPA.
Откройте раскрывающийся список методов и выберите метод GET(application/xml). Введите значение "3" в качестве максимального значения. Оставьте значения по умолчанию, определенные для остальных параметров, и нажмите кнопку тестирования. Результат отображается в разделе результатов тестирования
В разделе результатов тестирования отображается 5 вкладок.
Представление в табличной форме – это упрощенное представление со всеми идентификаторами URI в документе результата, к которому можно перейти при помощи ссылок.
В представлении необработанных данных отображаются фактически возвращенные данные. В зависимости от выбранного типа MIME (application/xml или application/json) данные будут представлены в формате XML или JSON, соответственно.
На вкладке подресурсов отображаются URL-адреса корневого ресурса и подресурсов. Если веб-служба RESTful построена на основе базы данных, корневой ресурс представляет таблицу базы данных, а подресурсы – столбцы.
На вкладке заголовков представлены данные заголовка HTTP.
На вкладке монитора HTTP отображаются текущие запросы HTTP, а также отправленные и полученный ответы.
Обратите внимание, что список результатов состоит из 6 пунктов, хотя в качестве максимального значения отображаемых сущностей установлено значение "3". Откройте вкладку представления необработанных данных для просмотра причины. Каждая сущность соответствует элементу <customer>, и в результате тестирования существует только 3 клиента. Однако на вкладке табличного представления указаны идентификаторы URI, а не сущности. Каждая сущность имеет два идентификатора URI: один является атрибутом родительского элемента <customer>, второй – атрибутом дочернего элемента <discountCode>. Таким образом, несмотря на то, что существует только 3 сущности клиента, в итоге используются 6 идентификаторов URI.
Закройте обозреватель и вернитесь к среде IDE.
Добавление функциональности Google Map
Целью этого упражнения является добавление функциональности Google Map в веб-службы RESTful.
Откройте класс CustomerRESTFacade (EE 5) или класс CustomerFacadeREST (EE 6) в редакторе.
Добавьте к классу следующий метод:
@GET
@Produces("text/html")
public String getGoogleMap() {
// Перетащите сюда операцию getGoogleMap
return "";
}
Подпишитесь на получение ключа карт Google по адресу http://www.google.com/apis/maps/signup.html. Диалоговое окно запроса на ключ карт Google содержит поле для ввода URL-адреса веб-сайта. Введите в это поле адрес http://localhost:8080.
Откройте в среде IDE вкладку "Службы" и разверните узел "Веб-службы". Разверните в узле "Веб-службы" узел "Google". В узле "Google" откройте узел службы карт.
Перетащите элемент getGoogleMap в тело метода getGoogleMap, созданного в действии 2, в позицию над строкой return = "";. Откроется диалоговое окно настройки getGoogleMap SAAS. Примите настройки по умолчанию и нажмите кнопку "ОК".
В среде IDE в метод getGoogleMap класса CustomerResource будет добавлен блок try, как показано в примере кода ниже.
Кроме того, создаются пакеты org.netbeans.saas и org.netbeans.saas.google, содержащие следующие классы и ресурсы:
RestConnection – обертка для HttpUrlConnection
RestResponse – обертка для ответа HTTP
googlemapservice.properties – файл свойств, где хранится ключ интерфейса API
GoogleMapService – обертка службы, содержащая методы обертки, использующие RestConnection для выполнения вызовов к службе Карт Google.
Замените в блоке try элемента getGoogleMap() закомментированный оператор print на строку return result.getDataAsString();. Теперь метод выглядит следующим образом:
Откройте googlemapservice.properties. Вставьте ключ интерфейса API, полученный от Google в действии 3.
Щелкните правой кнопкой мыши узел проекта CustomerDB и выберите пункт "Тестирование веб-служб RESTful". Будет выполнена отмена развертывания и повторное развертывание проекта на сервере, а также откроется диалоговое окно обозревателя с клиентом тестирования.
Щелкните элемент customers, расположенный слева. На главной странице будут выведены критерии тестирования для ресурса customers. Оставьте параметры настройки по умолчанию и нажмите кнопку тестирования. Появится таблица с клиентами.
Щелкните в таблице элемент customer1. На главной панели отобразится диалоговое окно тестирования для этого клиента. Выберите в раскрывающемся списке пункт text/html в качестве типа MIME. Нажмите кнопку тестирования. В представлении необработанных данных появится карта Google для адреса 16 Network Circle, Menlo Park.
Карта Google для адреса Menlo Park появится для всех клиентов в базе данных. Для отображения карт Google с реальными адресами клиентов, создайте экземпляр Customer и установите адрес, равный конкатенации переменных адресов для этого экземпляра Customer.
Для службы EE5 используйте метод getEntity(), чтобы создать экземпляр Customer для каждой сущности в базе данных (изменения выделены жирным шрифтом):
Для службы EE6 создайте экземпляр Customer, вызвав универсальный метод find() из абстрактного фасадного метода. Универсальный метод find() требует явного приведения типа аргумента к Object и явной установки идентификатора сущности. Следующий код EE6 отображает на карте местоположение клиента с идентификатором номер 1 (изменения выделены жирным шрифтом):
Снова протестируем веб-службы RESTful. В случае службы EE5 выберите тип MIME text/html для одного из покупателей. Теперь карта Google для адреса этого клиента отображается в представлении необработанных данных. В случае службы EE6 идентификатор клиента указан как аргумент для метода find(), а средство тестирования по умолчанию отображает представление необработанных данных. Для клиента customer1 отображается следующая карта:
Примечание. Если GoogleMaps не удается найти адрес, отображается вид океана в увеличенном масштабе.
Веб-службы RESTful на платформе Spring
Jersey интегрирована в платформу Spring. При создании веб-приложения на Java с использованием платформы Spring автоматически создается сервлет, поддерживающий REST. Однако Spring 3 не содержит файла aopalliance.jar, необходимого веб-службе RESTful для внедрения объекта EntityManager.
Создание веб-приложений Java с помощью платформы Spring
При создании веб-приложения на Java в мастере создания проекта, руководствуясь разделом Создание классов сущностей на основе базы данных, после выбора сервера следует нажать кнопку "Далее" вместо кнопки "Готово". В результате откроется панель "Платформы". Выберите "Spring Web MVC" и нажмите кнопку "Готово".
Добавление aopalliance.jar к проекту
Spring 3 не содержит файла aopalliance.jar. Эта библиотека необходима приложению для внедрения EntityManager. Для исправления проблемы необходимо загрузить этот файл jar и добавить его к пути класса. См. Проблема 193626 и форумы Spring.
Для добавления aopalliance.jar выполните следующие действия.
На панели Categories ("Категории") выберите Libraries ("Библиотеки"). Щелкните Add JAR/Folder ("Добавить JAR/Папку"). Откроется обозреватель файловой системы.
Перейдите к aopalliance.jar. Используйте ссылку на абсолютный путь. Нажмите кнопку "Открыть".
Файл aopalliance.jar теперь включен в библиотеки. Нажмите кнопку "ОК".
Создание служб RESTful в проекте с поддержкой Spring
После создания веб-приложения Java с помощью платформы Spring и добавления aopalliance.jar к пути классов проекта запустите веб-службу RESTful из мастера баз данных, как описано в Создании сущностей и служб. Однако ресурсы RESTful НЕ СЛЕДУЕТ регистрировать с помощью подкласса javax.ws.rs.core.Application. Вместо этого используйте дескриптор развертывания web.xml. Платформа Spring создает дескриптор развертывания web.xml во всех случаях.
Для получения дополнительных сведений о проектах на платформе Spring в среде IDE NetBeans ознакомьтесь с разделом Введение в платформу Spring.
Ошибки компиляции
Созданные классы служб могут содержать ошибки компиляции. Эти ошибки можно увидеть, если создать службы RESTful перед добавлением aopalliance.jar к пути класса.
Для исправления ошибок компиляции в классах служб выполните следующие действия:
Оставить комментарии и предложения, обратиться за поддержкой и получить информацию о последних достижениях в области функциональных возможностей разработки для Java EE с помощью среды IDE NetBeans можно в списке рассылки .