Руководство по отдыху

Руководство по отдыху

1. Вступление

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

В этом руководстве мы будем использовать RESTEasy, JBoss предоставил переносимую реализацию спецификации JAX-RS, чтобы создавать простые веб-службы 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:__


    3.0.14.Final


    
        org.jboss.resteasy
        resteasy-servlet-initializer
        ${resteasy.version}
    
    
        org.jboss.resteasy
        resteasy-client
        ${resteasy.version}
    

jboss-deployment-structure.xml

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

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

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


    
        
            
        
        
            
            
            
        
        
    

2.2. Настройка JBoss AS

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


    
        org.jboss.resteasy
        resteasy-jaxrs
        ${resteasy.version}
    

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

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

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

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




   RestEasy Example

   
      resteasy.servlet.mapping.prefix
      /rest
   

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

На этом этапе очень важно заметить, что мы не объявилиServlet вweb.xml, потому чтоresteasyservlet-initializer был добавлен как зависимость вpom.xml . Причина в том, что 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 singletons = new HashSet();

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

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


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

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

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

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

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

    private Map inventory = new HashMap();

    @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-интерфейс.

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