«1. Введение

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

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

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

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

    Автономная установка — предназначена для работы на каждом сервере приложений JBoss AS Setup — рассматривать только для развертывания в 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:

jboss-deployment-structure.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 все, что развертывается как WAR, JAR или EAR, является модулем. Эти модули называются динамическими модулями.

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

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

2.2. JBoss в качестве установки

<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>

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

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

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

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

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

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

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

<?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>

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

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

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

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

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

@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;
    }
}

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

3.3. Класс реализации сервисов

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

4. Выводы

@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();
    }
}

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

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

«