Una guida a RESTEasy

1. Introduzione

JAX-RS (API Java per servizi Web RESTful) è un set di API Java che fornisce supporto nella creazione di API REST . E il framework fa buon uso delle annotazioni per semplificare lo sviluppo e la distribuzione di queste API.

In questo tutorial, useremo RESTEasy, l'implementazione portatile fornita da JBoss della specifica JAX-RS, al fine di creare semplici servizi Web RESTful.

2. Configurazione del progetto

In due consideriamo due possibili scenari:

  • Configurazione standalone: ​​intesa per lavorare su ogni server delle applicazioni
  • JBoss AS Setup: da considerare solo per la distribuzione in JBoss AS

2.1. Configurazione autonoma

Iniziamo usando JBoss WildFly 10 con configurazione standalone.

JBoss WildFly 10 viene fornito con la versione RESTEasy 3.0.11, ma come vedrai, configureremo pom.xml con la nuova versione 3.0.14.

E grazie al resteasy-servlet-inizializzatore , RESTEasy fornisce l'integrazione con contenitori Servlet 3.0 autonomi tramite l' interfaccia di integrazione ServletContainerInitializer .

Diamo uno sguardo 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

All'interno di JBoss tutto ciò che viene distribuito come WAR, JAR o EAR è un modulo. Questi moduli sono indicati come moduli dinamici .

Oltre a questi, ci sono anche alcuni moduli statici in $ JBOSS_HOME / modules . Poiché JBoss ha i moduli statici RESTEasy , per la distribuzione autonoma, jboss-deployment-structure.xml è obbligatorio per escluderne alcuni.

In questo modo verranno caricate tutte le classi e i file JAR contenuti nel nostro WAR :

2.2. JBoss come installazione

Se stai per eseguire RESTEasy con JBoss versione 6 o successiva puoi scegliere di adottare le librerie già raggruppate nel server delle applicazioni, semplificando così il pom:

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

Notare che jboss-deployment-structure.xml non è più necessario.

3. Codice lato server

3.1. Servlet versione 3 web.xml

Diamo ora una rapida occhiata al web.xml del nostro semplice progetto qui:

 RestEasy Example resteasy.servlet.mapping.prefix /rest 

resteasy.servlet.mapping.prefix è necessario solo se si desidera anteporre un percorso relativo all'applicazione API.

A questo punto, è molto importante notare che non abbiamo dichiarato alcun Servlet in web.xml perché l' inizializzatore servlet resteasy è stato aggiunto come dipendenza in pom.xml . Il motivo è che RESTEasy fornisce la classe org.jboss.resteasy.plugins.servlet.ResteasyServletInitializer che implementa javax.server.ServletContainerInitializer .

ServletContainerInitializer è un inizializzatore e viene eseguito prima che qualsiasi contesto di servlet sia pronto: puoi utilizzare questo inizializzatore per definire servlet, filtri o listener per la tua app.

3.2. La classe dell'applicazione

La classe javax.ws.rs.core.Application è una classe JAX-RS standard che è possibile implementare per fornire informazioni sulla distribuzione:

@ApplicationPath("/rest") public class RestEasyServices extends Application { private Set singletons = new HashSet(); public RestEasyServices() { singletons.add(new MovieCrudService()); } @Override public Set getSingletons() { return singletons; } }

Come puoi vedere, questa è semplicemente una classe che elenca tutte le risorse e i fornitori di root JAX-RS ed è annotata con l' annotazione @ApplicationPath .

Se restituisci un set vuoto per classi e singleton, WAR verrà scansionato per risorse di annotazione JAX-RS e classi provider.

3.3. Una classe di implementazione dei servizi

Infine, vediamo una definizione API effettiva qui:

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

In questo breve tutorial abbiamo introdotto RESTEasy e con esso abbiamo costruito un'API semplicissima.

L'esempio utilizzato in questo articolo è disponibile come progetto di esempio in GitHub.