Um guia para RESTEasy

Um guia para RESTEasy

1. Introdução

JAX-RS (Java API para RESTful Web Services) é um conjunto de Java API que fornece suporte na criação deREST APIs. E a estrutura faz bom uso de anotações para simplificar o desenvolvimento e a implantação dessas APIs.

Neste tutorial, usaremos RESTEasy, o JBoss forneceu uma implementação portátil da especificação JAX-RS, a fim de criar um serviço da Web RESTful simples.

2. Configuração do Projeto

Vamos considerar dois cenários possíveis:

  • Configuração Independente - destinada a trabalhar em todos os servidores de aplicativos

  • Configuração do JBoss AS - a considerar apenas para implantação no JBoss AS

2.1. Configuração autônoma

Vamos começar usandoJBoss WildFly 10 com configuração autônoma.

O JBoss WildFly 10 vem com o RESTEasy versão 3.0.11, mas como você verá, vamos configurar opom.xml com a nova versão 3.0.14.

E graças aoresteasy-servlet-initializer, o RESTEasy fornece integração com contêineresServlet 3.0 autônomos por meio da interface de integraçãoServletContainerInitializer.

Vamos dar uma olhada empom.xml:__


    3.0.14.Final


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

jboss-deployment-structure.xml

No JBoss, tudo o que é implantado como WAR, JAR ou EAR é um módulo. Esses módulos são chamados dedynamic modules.

Ao lado deles, também existem algunsmodules estáticos em$JBOSS_HOME/modules. Como o JBoss tem o RESTEasystatic modules - para implantação autônoma, ojboss-deployment-structure.xml é obrigatório para excluir alguns deles.

Desta forma, todas as classes e arquivosJAR contidos em nossoWAR serão carregados:


    
        
            
        
        
            
            
            
        
        
    

2.2. Configuração do JBoss AS

Se você estiver executando o RESTEasy com o JBoss versão 6 ou superior, poderá optar por adotar as bibliotecas já empacotadas no servidor de aplicativos, simplificando assim o pom:


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

Observe quejboss-deployment-structure.xml não é mais necessário.

3. Código do lado do servidor

3.1. Servlet Versão 3 web.xml

Vamos agora dar uma olhada rápida no web.xml do nosso projeto simples aqui:




   RestEasy Example

   
      resteasy.servlet.mapping.prefix
      /rest
   

resteasy.servlet.mapping.prefix é necessário apenas se você quiser prefixar um caminho relativo para o aplicativo API.

Neste ponto, é muito importante notar que não declaramos nenhumServlet emweb.xml porqueresteasyservlet-initializer foi adicionado como dependência empom.xml . A razão para isso é - RESTEasy fornece a classeorg.jboss.resteasy.plugins.servlet.ResteasyServletInitializer que implementajavax.server.ServletContainerInitializer.

ServletContainerInitializer é um inicializador e é executado antes que qualquer contexto de servlet esteja pronto - você pode usar este inicializador para definir servlets, filtros ou ouvintes para seu aplicativo.

3.2. A classe de aplicativo

A classejavax.ws.rs.core.Application é uma classe JAX-RS padrão que você pode implementar para fornecer informações sobre sua implantação:

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

    private Set singletons = new HashSet();

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

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


Como você pode ver - esta é simplesmente uma classe que lista todos os recursos e provedores raiz JAX-RS e é anotada com a anotação@ApplicationPath.

Se você retornar qualquer conjunto vazio para classes e singletons, o WAR será varrido em busca de classes de recurso e provedor de anotação JAX-RS.

3.3. Uma classe de implementação de serviços

Finalmente, vamos ver uma definição real da API aqui:

@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. Conclusões

Neste tutorial rápido, apresentamos o RESTEasy e construímos uma API super simples.

O exemplo usado neste artigo está disponível comosample project in GitHub.