Статьи

Служба Google App Engine JAX-RS REST

В этой статье вы узнаете, как создать службу REST с использованием эталонной реализации JAX-RS (Джерси) и развернуть ее в Google AppEngine.

Предпосылки
Для этого урока вам понадобятся:
  • аккаунт Google AppEngine
  • Затмение Галилео (3.5.x)
  • Google App Engine SDK для Java
    • Установите плагин Google для Eclipse, как описано здесь (проверьте, что вы используете выпуск 1.3.1 GAE Java SDK, если не загрузите его, и настройте плагин для его использования)
    • также полезно иметь документацию AppEngine локально, вы можете скачать ее отсюда .
  • Реализация JAX-RS Reference, убедитесь, что вы взяли релиз Jersey 1.1.5. Вы можете скачать его здесь .
    • Распакуйте файл в каталог, который мы будем называть $ JERSEY_HOME
  • Реализация JAXB 2.2 для упрощения маршалинга / демаршаллинга XML, а также для облегчения поддержки JSON. Загрузите его отсюда
    • Установите его с помощью команды ja -jar JAXB2_20091104.jar. Каталог установки JAXB будет называться $ JAXB_HOME

Создание нового приложения

Чтобы создать новый проект App Engine в Eclipse:

  1. Нажмите на кнопку «Новый проект веб-приложения» на панели инструментов. Это также можно сделать с помощью меню Файл> Проект веб-приложения.
  2. Откроется мастер «Создание проекта веб-приложения»:
  • Название проекта: EmployeeService
  • Пакет: com.grallandco.employee.service
  • Снимите флажок «Использовать Google Web Toolkit»
  • Убедитесь, что используемая вами версия SDK — «App Engine 1.3.0»; если не настроить проект для его использования.
  • Экран должен выглядеть следующим образом:
  • Нажмите Готово
  • Проект должен выглядеть следующим образом:

Запуск приложения

App Egine SDK, установленный с плагином Eclipse, содержит веб-сервер (на базе Jetty), который можно использовать для тестирования и отладки. Чтобы проверить правильность создания приложения, выберите меню «Выполнить»> «Запуск от имени»> «Веб-приложение». Я лично большую часть времени запускаю свой сервер, используя команду отладки Run> DebugAs> Web Application. В режиме отладки вы можете изменить исходный код и выполнить тестирование без перезагрузки сервера.

Веб-сервер запускается автоматически, вы должны увидеть следующее сообщение в консоли Eclipse

Сервер работает по адресу http: // localhost: 8080 /

Вы можете получить доступ к приложению и образцу сервлета, который был создан с помощью URL: http: // localhost: 8080 / employeeservice

Чтобы остановить сервер, нажмите кнопку завершения в консоли Eclipse.

Настройка поддержки REST в приложении

Чтобы иметь возможность создавать и запускать службы REST в вашем приложении, вам необходимо:

  • Добавьте JAX-RS, JAXB Jars в свой проект и приложение
  • Настройте веб-приложение (web.xml) для обработки запросов REST.

Добавьте JAX-RS, JAXB в ваш проект

  1. Щелкните правой кнопкой мыши по проекту и выберите пункт меню Build Path> Configure Build Path…
  2. Нажмите на кнопку Добавить внешние JAR-файлы.
  3. Выберите все файлы JAR, расположенные в папках $ JERSEY_HOME / lib и $ JAXB_HOME / lib. Вы можете для большей наглядности и повторного использования создать пользовательскую библиотеку со всеми этими JAR-файлами.
  4. Вам также необходимо скопировать JAR-файлы в каталог web-inf / lib вашего приложения, этот шаг является обязательным, чтобы убедиться, что JAR-файлы включены в приложение при развертывании в App Engine.
    Примечание: мне не нравится этот шаг. Я бы предпочел сделать это путем настройки пути сборки, чтобы автоматически добавлять JAR-файлы в каталог WEB-INF / lib при выполнении / развертывании приложения. К сожалению, я не нашел способа сделать это, поэтому, если вы знаете это, не стесняйтесь оставлять комментарии, и я буду обновлять статью.

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

На этом этапе вы зарегистрируете новый URI для обработки запросов REST. Для этого вам нужно зарегистрировать новый сервлет, использующий API-интерфейс Jersey, и настроить его для определенного URI (например, / ressources и / или / rest) и настроить пакеты Java, содержащие классы реализации REST. Поэтому вам нужно изменить web.xml вашего приложения следующими записями:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
<servlet>
  <servlet-name>Jersey Web Application</servlet-name>
   <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
   <init-param>
   <param-name>com.sun.jersey.config.property.packages</param-name>
   <param-value>com.grallandco.employee.service.rest.impl</param-value>
   </init-param>
   <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
  <servlet-name>Jersey Web Application</servlet-name>
  <url-pattern>/resources/*</url-pattern>
</servlet-mapping>
 <servlet-mapping>
  <servlet-name>Jersey Web Application</servlet-name>
  <url-pattern>/rest/*</url-pattern>
</servlet-mapping>
Этот сервлет, который будет отвечать на URL-адреса / resources / и / rest /. Параметр конфигурации com.sun.jersey.config.property.packages используется Джерси для получения списка пакетов, в которых находится реализация служб REST. Обратите внимание, что вы можете поместить столько пакетов, сколько вам нужно, вам просто нужно разделить имена пакетов по;

Создание простого сервиса REST для тестирования среды

Теперь проект готов содержать сервис REST. Пришло время создать один. Создайте, например, класс com.grallandco.employee.service.rest.impl.HelloWorldResource, обязательно используйте имя пакета, которое вы настроили в web.xml для сервлета Джерси, на основе Конфигурация, которую мы сделали на предыдущем шаге, это пакет com.grallandco.employee.service.rest.impl

Вот пример класса с аннотациями JAX-RS:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
package com.grallandco.employee.service.rest.impl;
import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.ws.rs.Produces;
@Path("/hr/")
public class EmployeeResource {
  
 @GET
 @Produces("text/plain")
 @Path("/employee")
 public String getEmployee() {
        return "Hello World!";
    }
}

Вы должны быть в состоянии проверить его, остановить сервер и запустить его снова, введите следующий URL в вашем браузере:
HTTP: // локальный: 8080 / ресурсы / час / чел
или же
HTTP: // локальный: 8080 / отдых / час / чел

Развертывание приложения в Google App Engine

Перед развертыванием приложения необходимо зарегистрировать новое приложение в Google App Engine с помощью консоли администрирования, см. Документацию здесь . В моем примере я использовал «tugdual» в качестве идентификатора приложения.

Теперь вы можете легко развернуть приложение в Google App Engine, нажав кнопку «Развернуть проект App Engine», доступную на панели инструментов Eclipse.

Чтобы иметь возможность развернуть ваше приложение в Google App Engine, вам необходимо убедиться, что ваше приложение может быть зарегистрировано, идентификатор приложения хранится в файле WEB-INF / lib / appengine-web.xml.

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
 <application>[your-application-id]</application>  
 <version>1</version>   
 <!-- Configure java.util.logging -->
  <system-properties>
   <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
 </system-properties>   
</appengine-web-app>

Кнопка развертывания App Engine запрашивает несколько сведений: имя пользователя (ваша учетная запись Google) и пароль.

После завершения развертывания вы можете получить доступ к своему приложению, используя следующий URL:
Http: // [вашего-приложения] .appspot.com / ресурсы / час / чел
или же
Http: // [вашего-приложения] .appspot.com / отдых / час / чел

Добавление поддержки XML и JSON в сервис

Давайте теперь добавим новый метод для управления объектом «Сотрудник» с помощью сервиса, и формат данных должен быть основан на JSON и XML. Вот где JAXB полезен, так как он позволяет легко преобразовывать маршалловые / демаршалловые Java-объекты в XML — очевидно — и JSON (круто не так!)

Создание класса сотрудника

Начнем с создания нового класса для манипулирования данными Employee, это очень простой Java-класс, который может выглядеть следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package com.grallandco.employee.service.model;
import java.util.Date;
 
public class Employee {
    private String firstName;
    private String lastName;
    private Date hireDate;
    private String email;  
    public Employee(String firstName, String lastName, Date hireDate, String email) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.hireDate = hireDate;
        this.email = email;
    }
    public Employee() {}
    public String getFirstName() {
 return firstName;
 }
    public void setFirstName(String firstName) {
 this.firstName = firstName;
 }
    public String getLastName() {
 return lastName;
 }
    public void setLastName(String lastName) {
     this.lastName = lastName;
 }
    public Date getHireDate() {
 return hireDate;
 }
    public void setHireDate(Date hireDate) {
 this.hireDate = hireDate;
 }
    public String getEmail() {
        return email;
 }
    public void setEmail(String email) {
        this.email = email;
   }
    public String toString() {
        StringBuffer sb = new StringBuffer();
        sb.append("First: ").append(getFirstName());
        sb.append(" - Last: ").append(getLastName());
        sb.append(" - Date: ").append(getHireDate());
        sb.append(" - Email: ").append(getEmail());
        return sb.toString();
    }
}

При реализации вашего «реального» приложения с некоторым уровнем персистентности этот POJO является тем же объектом, что и JDO / JPA.

Создайте класс Converter для вашей сущности

Я обычно инкапсулирую все преобразования в некотором классе преобразователя, например, я напрямую не связываю свой бизнес-класс с механизмом сериализации. (Так что я делаю это для классов и списков классов). Поэтому вместо добавления аннотаций JAXB к самому классу Employee давайте создадим класс EmployeeConverter, который будет отвечать за преобразование и использоваться вашим REST-сервисом.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package com.grallandco.employee.service.converter;
 
import java.util.Date;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import com.grallandco.employee.service.model.Employee;
 
@XmlRootElement(name = "employee")
public class EmployeeConverter {
 private Employee entity = null;
 public EmployeeConverter() {
 entity = new Employee();
 }
 
 public EmployeeConverter(Employee entity) {
 this.entity = entity;
 }
 
 @XmlElement
 public String getFirstName() {
 return entity.getFirstName();
 }
 
 @XmlElement
 public String getLastName() {
 return entity.getLastName();
 }
 
 @XmlElement
 public Date getHireDate() {
 return entity.getHireDate();
 }
 
 @XmlElement
 public String getEmail() {
 return entity.getEmail();
 }
 
 public Employee getEmployee() {
 return entity;
 }
 
 public void setFirstName(String firstName) {
 entity.setFirstName(firstName);
 }
 
 public void setHireDate(Date hireDate) {
 entity.setHireDate(hireDate);
 }
 
 public void setLastName(String email) {
 entity.setEmail(email);
 }
 
 public void setEmail(String lastName) {
 entity.setLastName(lastName);
 }
}

Теперь вы можете обновить свой сервис, чтобы использовать этот класс утилиты / конвертера для возврата объекта XML или JSON в зависимости от типа содержимого запроса.

Добавьте поддержку JSON и XML в службу REST

Вам нужно изменить класс EmployeeRessource, изменить подпись и добавить новые аннотации метода getEmployee ().
Добавляемая вами аннотация:

  • @Produces ({«application / xml», «application / json»}): указывает, какой тип контента будет создаваться службой. На основании типа запроса.
  • @Path («/ employee / {employeeEmail} /»): измените Path, чтобы указать параметр Path, здесь, например, URL-адрес может принимать электронную почту в URI — не лучший пример, но вы получите точку…
  • public EmployeeConverter getEmployee (@PathParam («employeeEmail») String email): измените тип, возвращаемый методом, и получите в качестве String параметр, который соответствует параметру Path, определенному в аннотации @Path

Вот полный код класса:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.grallandco.employee.service.rest.impl;
 
import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import com.grallandco.employee.service.converter.EmployeeConverter;
import com.grallandco.employee.service.model.Employee;
 
@Path("/hr/")
public class EmployeeRessource {
 
  
 @GET
 @Produces({"application/xml", "application/json"})
 @Path("/employee/{employeeEmail}/")
 public EmployeeConverter getEmployee( @PathParam ("employeeEmail") String email) {
 //dummy code
 Employee emp = new Employee();
 emp.setEmail(email);
 emp.setFirstName("John");
 emp.setLastName("Doe");
 EmployeeConverter converter = new EmployeeConverter(emp);
 return converter;
 }
}

Протестируйте сервис

Теперь вы можете запустить сервер локально и протестировать сервис
HTTP: // локальный: 8080/resources/hr/employee/[email protected]
Это вернет XML-документ.
Если вы хотите проверить вызов JSON, у вас есть несколько вариантов:

  • Используя следующую команду
1
2
tgrall$ curl -H "Accept: application/json" http://localhost:8080/resources/hr/employee/tug@grallandco.com
{"email":"[email protected]","firstName":"John","lastName":"Doe"}
  • Используя HTTP-клиент, который позволяет вам полностью настроить / настроить HTTP-запрос, я использую Плакат Firefox Plugin
  • Использование некоторого кода Javascript в приложении

Вы можете повторить тест вашего развернутого приложения в Google App Engine.

Вывод

Из этой статьи вы узнали, как создать и развернуть новую службу REST в Google App Engine. Этот сервис был создан с помощью Реализованной реализации JAX-RS проекта Джерси. В следующей статье вы узнаете, как добавить постоянство и создать службу CRUD Rest в Google App Engine.

Ссылка: Создайте и разверните службу JAX-RS REST на Google App Engine от нашего партнера по JCG Тугдуала Гралла в блоге Tug’s Blog .