En guide til RESTEasy

1. Introduksjon

JAX-RS (Java API for RESTful Web Services) er et sett med Java API som gir støtte for oppretting REST APIer. Og rammeverket bruker god notater for å forenkle utviklingen og distribusjonen av disse API-ene.

I denne opplæringen bruker vi RESTEasy, JBoss ga bærbar implementering av JAX-RS-spesifikasjonen, for å lage en enkel RESTful Web-tjenester.

2. Prosjektoppsett

Vi skal to vurdere to mulige scenarier:

  • Frittstående oppsett - ment for å jobbe på alle applikasjonsservere
  • JBoss AS Setup - kun å vurdere for distribusjon i JBoss AS

2.1. Frittstående oppsett

La oss starte med å bruke JBoss WildFly 10 med frittstående oppsett.

JBoss WildFly 10 kommer med RESTEasy versjon 3.0.11, men som du ser, konfigurerer vi pom.xml med den nye 3.0.14-versjonen.

Og takk til resteasy-servlet-initializer, RESTEasy gir integrasjon med frittstående Servlet 3.0 containere via ServletContainerInitializer integrasjonsgrensesnitt.

La oss ta en titt på 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

Innen JBoss er alt som er distribuert som WAR, JAR eller EAR en modul. Disse modulene er referert til som dynamiske moduler.

Ved siden av disse er det også noe statisk moduler i $ JBOSS_HOME / moduler. Som JBoss har RESTEasy statiske moduler - for frittstående distribusjon, jboss-deployment-structure.xml er obligatorisk for å ekskludere noen av dem.

På denne måten, alle klasser og KRUKKE filer som finnes i vår KRIG vil bli lastet:

2.2. JBoss som oppsett

Hvis du skal kjøre RESTEasy med JBoss versjon 6 eller nyere, kan du velge å ta i bruk bibliotekene som allerede er samlet i applikasjonsserveren, og dermed forenkle pom:

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

Legg merke til det jboss-deployment-structure.xml er ikke lenger nødvendig.

3. Serversidekode

3.1. Servlet versjon 3 web.xml

La oss nå se raskt på web.xml for vårt enkle prosjekt her:

  RestEasy Eksempel resteasy.servlet.mapping.prefix / rest 

resteasy.servlet.mapping.prefix er bare nødvendig hvis du vil ha en relativ bane til API-applikasjonen.

På dette punktet er det veldig viktig å legge merke til at vi ikke har erklært noe Servlet iweb.xml fordi slapp av servlet-initialisering har blitt lagt til som avhengighet i pom.xml. Årsaken til det er - RESTEasy gir org.jboss.resteasy.plugins.servlet.ResteasyServletInitializer klasse som implementerer javax.server.ServletContainerInitializer.

ServletContainerInitializer er en initialisering og den kjøres før noen servletkontekst vil være klar - du kan bruke denne initialisereren til å definere servlets, filtre eller lyttere for appen din.

3.2. Søknadsklassen

De javax.ws.rs.core.Application klasse er en standard JAX-RS klasse som du kan implementere for å gi informasjon om distribusjonen din:

@ApplicationPath ("/ rest") offentlig klasse RestEasyServices utvider Application {private Set singletons = new HashSet (); offentlige RestEasyServices () {singletons.add (ny MovieCrudService ()); } @ Override public Set getSingletons () {return singletons; }}

Som du kan se - dette er ganske enkelt en klasse som viser alle JAX-RS rotressurser og leverandører, og den er merket med @ApplicationPath kommentar.

Hvis du returnerer et tomt sett for klasser og singletoner, vil WAR skannes for JAX-RS-merknadsressurs og leverandørklasser.

3.3. En tjenesteimplementeringsklasse

Til slutt, la oss se en faktisk API-definisjon her:

@Path ("/ filmer") offentlig klasse MovieCrudService {privat kartbeholdning = ny HashMap (); @GET @Path ("/ getinfo") @Produces ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) offentlig filmfilmByImdbId (@QueryParam ("imdbId") String imdbId) {if (inventar.containsKey (imdbId)) .get (imdbId); } annet {return null; }} @POST @Path ("/ addmovie") @Consumes ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) public Response addMovie (Filmfilm) {if (null! = Lager.get (movie.getImdbId ())) { return Response .status (Response.Status.NOT_MODIFIED) .entity ("Film er allerede i databasen."). build (); } inventar.put (movie.getImdbId (), film); returner Response.status (Response.Status.CREATED) .build (); }}

4. Konklusjoner

I denne raske opplæringen introduserte vi RESTEasy, og vi bygde en superenkel API med den.

Eksemplet som brukes i denne artikkelen er tilgjengelig som et eksempelprosjekt i GitHub.