Перейти к основному содержимому

Урок по RESTEasy

· 4 мин. чтения

1. Введение

JAX-RS (Java API для RESTful Web Services) — это набор Java API, обеспечивающий поддержку в создании REST API . И инфраструктура хорошо использует аннотации для упрощения разработки и развертывания этих API.

В этом руководстве мы будем использовать RESTEasy, переносимую реализацию JAX-RS, предоставленную JBoss, для создания простых веб-сервисов RESTful.

2. Настройка проекта

Мы собираемся рассмотреть два возможных сценария:

  • Автономная установка — предназначена для работы на каждом сервере приложений.
  • Установка JBoss AS — рассматривать только для развертывания в JBoss AS

2.1. Автономная установка

Начнем с использования JBoss WildFly 10 с автономной установкой.

JBoss WildFly 10 поставляется с RESTEasy версии 3.0.11, но, как вы увидите, мы настроим pom.xml с новой версией 3.0.14.

А благодаря resteasy-servlet-initializer RESTEasy обеспечивает интеграцию с автономными контейнерами Servlet 3.0 через интерфейс интеграции ServletContainerInitializer .

Давайте посмотрим на pom.xml : ``

<properties>
<resteasy.version>3.0.14.Final</resteasy.version>
</properties>
<dependencies>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-servlet-initializer</artifactId>
<version>${resteasy.version}</version>
</dependency>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-client</artifactId>
<version>${resteasy.version}</version>
</dependency>
</dependencies>

jboss-deployment-structure.xml

В JBoss все, что развернуто как WAR, JAR или EAR, является модулем. Эти модули называются динамическими модулями .

Кроме того, в $JBOSS_HOME/modules есть несколько статических модулей . Поскольку у JBoss есть статические модули RESTEasy — для автономного развертывания файл jboss-deployment-structure.xml является обязательным, чтобы исключить некоторые из них. ``

Таким образом, все классы и файлы JAR , содержащиеся в нашем WAR , будут загружены:

<jboss-deployment-structure>
<deployment>
<exclude-subsystems>
<subsystem name="resteasy" />
</exclude-subsystems>
<exclusions>
<module name="javaee.api" />
<module name="javax.ws.rs.api"/>
<module name="org.jboss.resteasy.resteasy-jaxrs" />
</exclusions>
<local-last value="true" />
</deployment>
</jboss-deployment-structure>

2.2. JBoss как установка

Если вы собираетесь запускать RESTEasy с JBoss версии 6 или выше, вы можете принять библиотеки, уже связанные с сервером приложений, что упростит pom:

<dependencies>
<dependency>
<groupId>org.jboss.resteasy</groupId>
<artifactId>resteasy-jaxrs</artifactId>
<version>${resteasy.version}</version>
</dependency>
<dependencies>

Обратите внимание, что файл jboss-deployment-structure.xml больше не нужен.

3. Серверный код

3.1. Сервлет версии 3 web.xml

Теперь давайте быстро взглянем на файл web.xml нашего простого проекта:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

<display-name>RestEasy Example</display-name>

<context-param>
<param-name>resteasy.servlet.mapping.prefix</param-name>
<param-value>/rest</param-value>
</context-param>

</web-app>

resteasy.servlet.mapping.prefix необходим, только если вы хотите добавить относительный путь к приложению API.

На этом этапе очень важно отметить, что мы не объявили ни одного сервлета в файле web.xml , поскольку в качестве зависимости в pom.xml был добавлен инициализатор resteasy servlet-initializer . Причина этого в том, что RESTEasy предоставляет класс org.jboss.resteasy.plugins.servlet.ResteasyServletInitializer , который реализует javax.server.ServletContainerInitializer . **** `` ``

ServletContainerInitializer — это инициализатор, который выполняется до того, как будет готов любой контекст сервлета — вы можете использовать этот инициализатор для определения сервлетов, фильтров или прослушивателей для вашего приложения.

3.2. Класс приложения

Класс javax.ws.rs.core.Application — это стандартный класс JAX-RS, который вы можете реализовать для предоставления информации о вашем развертывании:

@ApplicationPath("/rest")
public class RestEasyServices extends Application {

private Set<Object> singletons = new HashSet<Object>();

public RestEasyServices() {
singletons.add(new MovieCrudService());
}

@Override
public Set<Object> getSingletons() {
return singletons;
}
}

Как видите, это просто класс, в котором перечислены все корневые ресурсы и поставщики JAX-RS, и он снабжен аннотацией @ApplicationPath .

Если вы вернете какой-либо пустой набор для классов и синглтонов, WAR будет просканирован на предмет ресурсов аннотаций JAX-RS и классов поставщиков.

3.3. Класс реализации служб

Наконец, давайте посмотрим здесь фактическое определение API:

@Path("/movies")
public class MovieCrudService {

private Map<String, Movie> inventory = new HashMap<String, Movie>();

@GET
@Path("/getinfo")
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Movie movieByImdbId(@QueryParam("imdbId") String imdbId) {
if (inventory.containsKey(imdbId)) {
return inventory.get(imdbId);
} else {
return null;
}
}

@POST
@Path("/addmovie")
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
public Response addMovie(Movie movie) {
if (null != inventory.get(movie.getImdbId())) {
return Response
.status(Response.Status.NOT_MODIFIED)
.entity("Movie is Already in the database.").build();
}

inventory.put(movie.getImdbId(), movie);
return Response.status(Response.Status.CREATED).build();
}
}

4. Выводы

В этом кратком руководстве мы представили RESTEasy и создали с его помощью очень простой API.

Пример, использованный в этой статье, доступен в качестве образца проекта на GitHub .