Ein Leitfaden für RESTEasy

Ein Leitfaden für RESTEasy

1. Einführung

JAX-RS (Java-API für RESTful Web Services) ist eine Reihe von Java-APIs, die Unterstützung beim Erstellen vonREST 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. Projektaufbau

Wir werden zwei mögliche Szenarien betrachten:

  • 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 vonJBoss WildFly 10 mit Standalone-Setup.

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

Und dankresteasy-servlet-initializer bietet RESTEasy die Integration mit eigenständigenServlet 3.0-Containern über die Integrationsschnittstelle vonServletContainerInitializer.

Schauen wir uns diepom.xml:__ an


    3.0.14.Final


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

jboss-deployment-structure.xml

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

Daneben gibt es auch einige statischemodules in$JBOSS_HOME/modules. Da JBoss die RESTEasystatic modules - für die eigenständige Bereitstellung hat, ist diejboss-deployment-structure.xml obligatorisch, um einige von ihnen auszuschließen.

Auf diese Weise werden alle in unserenWAR enthaltenen Klassen undJAR-Dateien geladen:


    
        
            
        
        
            
            
            
        
        
    

2.2. JBoss AS Setup

Wenn Sie RESTEasy mit JBoss Version 6 oder höher ausführen, können Sie die Bibliotheken übernehmen, die bereits auf dem Anwendungsserver enthalten sind.


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

Beachten Sie, dassjboss-deployment-structure.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 inweb.xml keineServlet deklariert haben, daresteasyservlet-initializer als Abhängigkeit inpom.xml hinzugefügt wurden . Der Grund dafür ist - RESTEasy stellt die Klasseorg.jboss.resteasy.plugins.servlet.ResteasyServletInitializer bereit, diejavax.server.ServletContainerInitializer implementiert.

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

3.2. Die Anwendungsklasse

Die Klassejavax.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@ApplicationPathversehen ist.

Wenn Sie einen leeren Satz für Klassen und Singletons zurückgeben, wird die WAR-Datei nach JAX-RS-Anmerkungsressourcen 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. Schlussfolgerungen

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

Das in diesem Artikel verwendete Beispiel ist alssample project in GitHub verfügbar.