Een gids voor RESTEasy

1. Inleiding

JAX-RS (Java API for RESTful Web Services) is een set Java API die ondersteuning biedt bij het maken van REST API's. En het framework maakt goed gebruik van annotaties om de ontwikkeling en implementatie van deze API's te vereenvoudigen.

In deze tutorial gebruiken we RESTEasy, de door JBoss geleverde draagbare implementatie van JAX-RS-specificatie, om een ​​eenvoudige RESTful Web-services te creëren.

2. Projectconfiguratie

We gaan twee overwegen twee mogelijke scenario's:

  • Standalone Setup - bedoeld om op elke applicatieserver te werken
  • JBoss AS Setup - alleen te overwegen voor implementatie in JBoss AS

2.1. Zelfstandige installatie

Laten we beginnen met JBoss WildFly 10 met zelfstandige opstelling.

JBoss WildFly 10 wordt geleverd met RESTEasy versie 3.0.11, maar zoals u zult zien, zullen we de pom.xml met de nieuwe 3.0.14-versie.

En dankzij de resteasy-servlet-initializer, RESTEasy biedt integratie met standalone Servlet 3.0 containers via de ServletContainerInitializer integratie-interface.

Laten we eens kijken naar de pom.xml:

 3.0.14.Finale org.jboss.resteasy resteasy-servlet-initializer $ {resteasy.version} org.jboss.resteasy resteasy-client $ {resteasy.version} 

jboss-deployment-structure.xml

Binnen JBoss is alles wat als WAR, JAR of EAR wordt ingezet een module. Deze modules worden aangeduid als dynamische modules.

Naast deze zijn er ook enkele statische modules in $ JBOSS_HOME / modules. Omdat JBoss de RESTEasy heeft statische modules - voor stand-alone implementatie, de jboss-deployment-structure.xml is verplicht om enkele ervan uit te sluiten.

Op deze manier kunnen alle klassen en POT bestanden in onze OORLOG wordt geladen:

2.2. JBoss als Setup

Als je RESTEasy gaat draaien met JBoss versie 6 of hoger, kun je ervoor kiezen om de bibliotheken die al gebundeld zijn in de applicatieserver over te nemen, waardoor de pom wordt vereenvoudigd:

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

Let erop dat jboss-deployment-structure.xml is niet langer nodig.

3. Serverzijde code

3.1. Servlet versie 3 web.xml

Laten we nu even snel de web.xml van ons eenvoudige project bekijken:

  RestEasy Voorbeeld resteasy.servlet.mapping.prefix / rest 

resteasy.servlet.mapping.prefix is alleen nodig als u een relatief pad naar de API-applicatie wilt toevoegen.

Op dit punt is het erg belangrijk om op te merken dat we er geen hebben verklaard Servlet in deweb.xml omdat rustgevend servlet-initializer is toegevoegd als afhankelijkheid in pom.xml. De reden daarvoor is - RESTEasy biedt org.jboss.resteasy.plugins.servlet.ResteasyServletInitializer klasse die implementeert javax.server.ServletContainerInitializer.

ServletContainerInitializer is een initialisatieprogramma en wordt uitgevoerd voordat een servlet-context gereed is. U kunt deze initializer gebruiken om servlets, filters of luisteraars voor uw app te definiëren.

3.2. De toepassingsklasse

De javax.ws.rs.core.Application class is een standaard JAX-RS-klasse die u kunt implementeren om informatie te verstrekken over uw implementatie:

@ApplicationPath ("/ rest") openbare klasse RestEasyServices breidt Application {private Set singletons = new HashSet () uit; openbare RestEasyServices () {singletons.add (nieuwe MovieCrudService ()); } @Override public Set getSingletons () {retour singletons; }}

Zoals u kunt zien - dit is gewoon een klasse waarin alle JAX-RS-rootbronnen en -providers worden vermeld, en het is geannoteerd met de @ApplicationPath annotatie.

Als u een lege set voor by klassen en singletons retourneert, wordt de WAR gescand op JAX-RS-annotatiebronnen en providerklassen.

3.3. Een Services Implementation Class

Laten we tot slot hier een actuele API-definitie bekijken:

@Path ("/ movies") public class MovieCrudService {private Map inventory = nieuwe HashMap (); @GET @Path ("/ getinfo") @Produces ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) openbare film movieByImdbId (@QueryParam ("imdbId") String imdbId) {if (inventory.containsKey (imdbId)) {inventaris terug .get (imdbId); } else {retourneer null; }} @POST @Path ("/ addmovie") @Consumes ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) openbare reactie addMovie (filmfilm) {if (null! = Inventory.get (movie.getImdbId ())) { return Response .status (Response.Status.NOT_MODIFIED) .entity ("Film staat al in de database."). build (); } inventory.put (movie.getImdbId (), film); return Response.status (Response.Status.CREATED) .build (); }}

4. Conclusies

In deze korte tutorial hebben we RESTEasy geïntroduceerd en we hebben er een supereenvoudige API mee gebouwd.

Het voorbeeld dat in dit artikel wordt gebruikt, is beschikbaar als voorbeeldproject in GitHub.