Una guía para RESTEasy

1. Introducción

JAX-RS (API de Java para servicios web RESTful) es un conjunto de API de Java que proporciona soporte para la creación de API de REST . Y el marco hace un buen uso de las anotaciones para simplificar el desarrollo y la implementación de estas API.

En este tutorial, usaremos RESTEasy, la implementación portátil proporcionada por JBoss de la especificación JAX-RS, para crear un servicio web RESTful simple.

2. Configuración del proyecto

Vamos a considerar dos posibles escenarios:

  • Configuración independiente: diseñada para trabajar en todos los servidores de aplicaciones
  • Configuración de JBoss AS: a considerar solo para la implementación en JBoss AS

2.1. Configuración independiente

Comencemos usando JBoss WildFly 10 con una configuración independiente.

JBoss WildFly 10 viene con RESTEasy versión 3.0.11, pero como verá, configuraremos pom.xml con la nueva versión 3.0.14.

Y gracias a resteasy-servlet-initializer , RESTEasy proporciona integración con contenedores Servlet 3.0 independientes a través de la interfaz de integración ServletContainerInitializer .

Echemos un vistazo al 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

Dentro de JBoss, todo lo que se implementa como WAR, JAR o EAR es un módulo. Estos módulos se denominan módulos dinámicos .

Además de estos, también hay algunos módulos estáticos en $ JBOSS_HOME / modules . Como JBoss tiene los módulos estáticos RESTEasy , para la implementación independiente, jboss-deployment-structure.xml es obligatorio para excluir algunos de ellos.

De esta forma se cargarán todas las clases y archivos JAR contenidos en nuestro WAR :

2.2. JBoss como configuración

Si va a ejecutar RESTEasy con JBoss versión 6 o superior, puede optar por adoptar las bibliotecas que ya están incluidas en el servidor de aplicaciones, simplificando así el pom:

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

Observe que jboss-deployment-structure.xml ya no es necesario.

3. Código del lado del servidor

3.1. Servlet Versión 3 web.xml

Ahora echemos un vistazo rápido al web.xml de nuestro proyecto simple aquí:

 RestEasy Example resteasy.servlet.mapping.prefix /rest 

resteasy.servlet.mapping.prefix es necesario solo si desea anteponer una ruta relativa a la aplicación API.

En este punto, es muy importante notar que no hemos declarado ningún Servlet en web.xml porque se ha agregado resteasy servlet-initializer como dependencia en pom.xml . La razón de esto es que RESTEasy proporciona la clase org.jboss.resteasy.plugins.servlet.ResteasyServletInitializer que implementa javax.server.ServletContainerInitializer .

ServletContainerInitializer es un inicializador y se ejecuta antes de que cualquier contexto de servlet esté listo; puede usar este inicializador para definir servlets, filtros u oyentes para su aplicación.

3.2. La clase de aplicación

La clase javax.ws.rs.core.Application es una clase JAX-RS estándar que puede implementar para proporcionar información sobre su implementación:

@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 puede ver, esta es simplemente una clase que enumera todos los recursos y proveedores raíz de JAX-RS, y está anotada con la anotación @ApplicationPath .

Si devuelve un conjunto vacío para por clases y singleton, el WAR se escaneará en busca de recursos de anotación JAX-RS y clases de proveedor.

3.3. Una clase de implementación de servicios

Finalmente, veamos una definición de API real aquí:

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

En este tutorial rápido presentamos RESTEasy y construimos una API súper simple con él.

El ejemplo utilizado en este artículo está disponible como proyecto de muestra en GitHub.