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 .