En guide til RESTEasy

1. Introduktion

JAX-RS (Java API for RESTful Web Services) er et sæt Java API, der yder support til oprettelse REST API'er. Og rammen gør god brug af annoteringer for at forenkle udviklingen og implementeringen af ​​disse API'er.

I denne vejledning bruger vi RESTEasy, JBoss leverede bærbar implementering af JAX-RS-specifikation for at skabe en simpel RESTful Web-service.

2. Opsætning af projekt

Vi går to overvejer to mulige scenarier:

  • Standalone Setup - beregnet til arbejde på hver applikationsserver
  • JBoss AS-opsætning - kun at overveje til implementering i JBoss AS

2.1. Uafhængig opsætning

Lad os starte med at bruge JBoss WildFly 10 med standalone opsætning.

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

Og tak til resteasy-servlet-initializer, RESTEasy giver integration med enkeltstående Servlet 3.0 containere via ServletContainerInitializer integrationsgrænseflade.

Lad os se 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

Inden for JBoss er alt, hvad der er implementeret som WAR, JAR eller EAR, et modul. Disse moduler kaldes dynamiske moduler.

Udover disse er der også noget statisk moduler i $ JBOSS_HOME / moduler. Da JBoss har RESTEasy statiske moduler - for uafhængig indsættelse, jboss-deployment-structure.xml er obligatorisk for at udelukke nogle af dem.

På denne måde er alle klasser og KRUKKE filer indeholdt i vores KRIG vil blive indlæst:

2.2. JBoss som opsætning

Hvis du vil køre RESTEasy med JBoss version 6 eller højere, kan du vælge at vedtage de biblioteker, der allerede er samlet i applikationsserveren, og dermed forenkle pom:

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

Læg mærke til det jboss-deployment-structure.xml er ikke længere nødvendigt.

3. Serversidekode

3.1. Servlet version 3 web.xml

Lad os nu se hurtigt på web.xml for vores enkle projekt her:

  RestEasy Eksempel resteasy.servlet.mapping.prefix / rest 

resteasy.servlet.mapping.prefix er kun nødvendigt, hvis du vil have en relativ sti til API-applikationen.

På dette tidspunkt er det meget vigtigt at bemærke, at vi ikke har erklæret nogen Servlet iweb.xml fordi rolig servlet-initialisering er blevet tilføjet som afhængighed i pom.xml. Årsagen til det er - RESTEasy giver org.jboss.resteasy.plugins.servlet.ResteasyServletInitializer klasse, der implementerer javax.server.ServletContainerInitializer.

ServletContainerInitializer er en initialisering, og den udføres, før en hvilken som helst servletkontekst vil være klar - du kan bruge denne initialisering til at definere servlets, filtre eller lyttere til din app.

3.2. Ansøgningsklassen

Det javax.ws.rs.core.Applikation klasse er en standard JAX-RS klasse, som du kan implementere for at give oplysninger om din implementering:

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

Som du kan se - dette er simpelthen en klasse, der viser alle JAX-RS rodressourcer og udbydere, og det er kommenteret med @ApplicationPath kommentar.

Hvis du returnerer et tomt sæt efter klasser og singletoner, scannes WAR efter JAX-RS-annoteringsressource og udbyderklasser.

3.3. En serviceimplementeringsklasse

Lad os endelig se en egentlig API-definition her:

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

4 konklusioner

I denne hurtige vejledning introducerede vi RESTEasy, og vi byggede en super simpel API med den.

Eksemplet brugt i denne artikel er tilgængeligt som et eksempelprojekt i GitHub.