Ein Leitfaden für RESTEasy

1. Einleitung

JAX-RS (Java-API für RESTful Web Services) ist eine Reihe von Java-APIs, die Unterstützung beim Erstellen von REST-APIs bieten . Das Framework nutzt Anmerkungen, um die Entwicklung und Bereitstellung dieser APIs zu vereinfachen.

In diesem Tutorial verwenden wir RESTEasy, die von JBoss bereitgestellte portable Implementierung der JAX-RS-Spezifikation, um einfache RESTful-Webdienste zu erstellen.

2. Projekteinrichtung

Wir gehen zwei betrachten zwei mögliche Szenarien:

  • Standalone-Setup - für die Arbeit auf jedem Anwendungsserver
  • JBoss AS-Setup - Nur für die Bereitstellung in JBoss AS zu berücksichtigen

2.1. Standalone-Setup

Beginnen wir mit der Verwendung von JBoss WildFly 10 mit eigenständigem Setup.

JBoss WildFly 10 wird mit RESTEasy Version 3.0.11 geliefert. Wie Sie sehen werden, konfigurieren wir die Datei pom.xml mit der neuen Version 3.0.14.

Und dank des Resteasy-Servlet-Initialisierers bietet RESTEasy die Integration in eigenständige Servlet 3.0- Container über die Integrationsschnittstelle ServletContainerInitializer .

Werfen wir einen Blick auf die pom.xml :

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

jboss-deploy-struct.xml

In JBoss ist alles, was als WAR, JAR oder EAR bereitgestellt wird, ein Modul. Diese Module werden als dynamische Module bezeichnet .

Daneben gibt es auch einige statische Module in $ JBOSS_HOME / modules . Da JBoss über die statischen RESTEasy- Module verfügt - für die eigenständige Bereitstellung ist die Datei jboss-deploy-struct.xml obligatorisch, um einige davon auszuschließen.

Auf diese Weise werden alle in unserer WAR enthaltenen Klassen und JAR- Dateien geladen:

2.2. JBoss als Setup

Wenn Sie RESTEasy mit JBoss Version 6 oder höher ausführen möchten, können Sie die bereits auf dem Anwendungsserver gebündelten Bibliotheken übernehmen und so das pom vereinfachen:

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

Beachten Sie, dass jboss-deploy-struct.xml nicht mehr benötigt wird.

3. Serverseitiger Code

3.1. Servlet Version 3 web.xml

Lassen Sie uns nun einen kurzen Blick auf die web.xml unseres einfachen Projekts werfen:

 RestEasy Example resteasy.servlet.mapping.prefix /rest 

resteasy.servlet.mapping.prefix wird nur benötigt, wenn Sie einen relativen Pfad zur API-Anwendung voranstellen möchten.

An dieser Stelle ist es sehr wichtig zu beachten, dass wir kein Servlet in der web.xml deklariert haben, da der resteasy Servlet-Initialisierer als Abhängigkeit in pom.xml hinzugefügt wurde . Der Grund dafür ist - Resteasy bietet org.jboss.resteasy.plugins.servlet.ResteasyServletInitializer Klasse, die implementiert javax.server.ServletContainerInitializer .

ServletContainerInitializer ist ein Initialisierer und wird ausgeführt, bevor ein Servlet-Kontext bereitsteht. Mit diesem Initialisierer können Sie Servlets, Filter oder Listener für Ihre App definieren.

3.2. Die Anwendungsklasse

Die Klasse javax.ws.rs.core.Application ist eine Standard-JAX-RS-Klasse, die Sie implementieren können, um Informationen zu Ihrer Bereitstellung bereitzustellen:

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

Wie Sie sehen können, handelt es sich lediglich um eine Klasse, in der alle JAX-RS- Stammressourcen und -Anbieter aufgelistet sind und die mit der Annotation @ApplicationPath versehen ist .

Wenn Sie einen leeren Satz für Klassen und Singletons zurückgeben, wird die WAR nach JAX-RS-Annotationsressourcen und Anbieterklassen durchsucht.

3.3. Eine Services-Implementierungsklasse

Zum Schluss sehen wir uns hier eine aktuelle API-Definition an:

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

In diesem kurzen Tutorial haben wir RESTEasy vorgestellt und damit eine supereinfache API erstellt.

Das in diesem Artikel verwendete Beispiel ist als Beispielprojekt in GitHub verfügbar.