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