Vor kurzem wurde JBoss AS 7 CR1 veröffentlicht. In der vorherigen Version war es ziemlich einfach, RESTful-Anwendungen mit der eingebauten JAX-RS-Unterstützung auf der Grundlage von RESTeasy zu entwickeln. In diesem Blog werde ich mir ansehen, wie gut die neue Version von JBoss mit dem Rest des Feldes mithalten kann.
Änderungen: JBoss Module
JBoss Modules, ein modulares System zum Laden von Klassen, vergleichbar mit Jigsaw, DEM modularen System für Java, das (wahrscheinlich) eines Tages die JVM erreichen wird. Bis dahin können jedoch JBoss-Module verwendet werden. Nachdem Sie die Version JBoss AS 7 CR1 heruntergeladen und entpackt haben, finden Sie alle Module im Unterverzeichnis ''modules'', das in einer Struktur gruppiert ist, die ein wenig an ein Maven-Repository erinnert: Sie finden dort zum Beispiel Verzeichnisse für ''org'', ''javax'' und ''net'', ähnlich der Verzeichnisstruktur von group-ids und artifact-ids in einem Maven2-Repository-Layout. Auf einer bestimmten Ebene gibt es jedoch einen ''main''-Ordner, in dem die Implementierungsdetails des Moduls gespeichert werden: eine kleine XML-Datei, die das Modul beschreibt, und einige jar-Dateien, die den Inhalt des Moduls bilden. Ein sehr nützlicher Nebeneffekt davon ist, dass es recht einfach ist, herauszufinden, welche Versionen von welchen jars der AS verwendet: Die jar-Dateien im Modul sind in der Regel die Maven-Artefakte und enthalten daher die Versionsnummer in ihrem Namen. Siehe zum Beispiel das Modul javax.activation unten.
Eine weitere Folge dieser Änderung ist, dass die übliche JBoss-Struktur mit einem ''Server''-Verzeichnis mit mehreren Profilen wie ''default'', ''web'' und ''minimal'' nicht mehr existiert. Die Hauptstruktur hat jetzt ein ''standalone''-Verzeichnis für den Betrieb eines einfachen Servers und ein ''domain''-Verzeichnis für den Betrieb eines Clusters.
Installation
Die Installation ist wie immer sehr einfach. Eine Entwicklungsumgebung ist jedoch ohne eine gute Integration zwischen der IDE und dem Anwendungsserver auf dem lokalen System nicht einsatzbereit. Die IDE Ihrer Wahl ist Eclipse, da sie über eine gute Plugin-Suite für JBoss Tools verfügt. Das Befolgen dieser Anweisungen ist bereits ein großer Teil der Installation. Um die Dinge wirklich einfach zu machen, fügen wir die Maven-Integration für Eclipse mit WTP von Sonatype in den Mix ein. Besonders die Suche nach der richtigen Version der Maven-Integration für WTP war schwierig. Ich habe schließlich eine Kopie gefunden, die mit dem Rest des Setups auf dieser Update-Site funktionierte. Das Starten des Servers kann jetzt über das Eclipse-Server-Fenster erfolgen. Wenn Sie den Standardport ansteuern, wird ein schönes Willkommensfenster angezeigt und wenn Sie die Verwaltungskonsole aufrufen, sehen Sie eine einfache, aber nützliche Verwaltungsoberfläche.
Bisher gibt es zwei kleine Probleme mit der Einrichtung:
- Eclipse scheint das Starten des Servers nicht zu erkennen. Das ist ziemlich ärgerlich, denn Eclipse kompiliert jetzt nichts mehr, da es auf das Ende des Prozesses wartet.
Dies kann umgangen werden, indem Sie im Bildschirm Serverübersicht des JBoss 7 AS-Servers den Startup Poller auf ''Web Port Poller'' setzen.
- Eclipse ist nicht in der Lage, JBoss zu stoppen. Zumindest nicht von der Serveransicht aus.
JBoss kann immer noch von der Konsolenansicht aus gestoppt werden, aber das bedeutet, dass der Neustart des Servers immer mindestens 4 Mausklicks erfordert: (1) zur Konsole gehen (2) stoppen (3) zu den Servern gehen (4) neu starten, was ziemlich nervig ist. Wie auch immer, mit kleinen Ärgernissen zu leben ist für jeden in der IT-Branche eine Selbstverständlichkeit, also warum sollte ein einfacher JEE-Anwendungsentwickler anders sein ;)
Starten Sie das Projekt
Nun, da alles eingerichtet ist, können wir zum interessanteren Teil übergehen, nämlich dem Projekt und dem Java-Code. Mit Hilfe von M2Eclipse erstellen wir ein Maven-Projekt mit dem folgenden pom:
[xml highlight="41,42-47"] <project xmlns_xsi="https://www.w3.org/2001/XMLSchema-instance" xsi_schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd "> <modelVersion>4.0.0</modelVersion> <groupId>com.xebia.library</groupId> <artifactId>library</artifactId> <version>0.9-SNAPSHOT</version> <packaging>war</packaging> <repositories> <repository> <id>jboss</id> <url> https://repository.jboss.org/nexus/content/groups/public-jboss/ </url> </repository> </repositories> <build> <plugins> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>2.4.3</version> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <version>2.1.1</version> <configuration> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>org.jboss.spec</groupId> <artifactId>jboss-javaee-6.0</artifactId> <version>2.0.0.CR1</version> <type>pom</type> <scope>provided</scope> </dependency> <dependency> <groupId>org.jboss.resteasy</groupId> <artifactId>resteasy-jaxrs</artifactId> <version>2.2.1.GA</version> <scope>provided</scope> </dependency> </dependencies> </project> [/xml]Dieses pom konfiguriert das Maven-Projekt und das Eclipse-WTP-Projekt korrekt für die Bereitstellung auf JBoss. Die hervorgehobenen Zeilen zeigen die Abhängigkeit von einem pom mit den Aggregated Java EE 6.0 APIs, die JBoss bereitstellt. Dieses Pom soll verwendet werden, um die richtigen Versionsnummern aller Java EE-APIs in Ihr eigenes Pom zu importieren. Da ich faul bin, werde ich mich einfach auf dieses Pom verlassen, so dass alle APIs bereits in meinem Projekt verfügbar sind, ohne dass ich sie separat angeben muss. Jetzt haben wir ein gut konfiguriertes Maven Web-Projekt in Eclipse. Das Layout sieht wie in der Abbildung unten aus.
Und nun zu etwas Java-Code: Wie konfigurieren wir das RESTeasy-Framework?
[java title="com/xebia/library/LibraryApplication.java"] package com.xebia.library; import javax.ws.rs.ApplicationPath; import javax.ws.rs.core.Application; @ApplicationPath("services") public class LibraryApplication extends Application { } [/java]Das war's! Von der Klasse aus wird RESTeasy konfiguriert und die RESTful Webdienste werden unter ''/services'' im Kontext des Projekts verfügbar sein. Fügen wir einen einfachen Webdienst hinzu.
[java title="com/xebia/library/BookRepository.java"] package com.xebia.library; import java.util.List; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import com.xebia.library.model.Book; @Path("books") public interface BookRepository { @GET @Path("/") @Produces(MediaType.APPLICATION_JSON) List<Book> all(); } [/java]Diese Schnittstelle definiert den RESTful Web Service mit Hilfe der JAX-RS-Annotationen. Das Hinzufügen einer Schnittstelle ist nützlich, aber nicht notwendig.
[java title="com/xebia/library/impl/BookRepositoryBean.java"] package com.xebia.library.impl; import java.util.Collections; import java.util.List; import com.xebia.library.BookRepository; import com.xebia.library.model.Book; public class BookRepositoryBean implements BookRepository { @Override public List<Book> all() { return Collections.singletonList(new Book("My Title")); } } [/java]Die Implementierung des Webdienstes ist (vorerst) sehr einfach und verwendet ein sehr einfaches POJO als Rückgabewert.
[java title="com/xebia/library/model/Book.java"] package com.xebia.library.model; public class Book { private String title; public Book() { } public Book(String title) { this.title = title; } public String getTitle() { return title; } } [/java]Mit diesen einfachen Dateien haben wir alles, was wir brauchen, um einen RESTful Web Service auf JBoss AS 7 zum Laufen zu bringen. Wenn Sie den Browser auf die richtige URL verweisen, erhalten Sie einen JSON-String wie unten gezeigt.
Die URL setzt sich aus mehreren Teilen zusammen:
- https://xebia.com/blog:8080 Der JBoss Webserver
- Bibliothek Der Anwendungskontext
- services Der für die JAX-RS-Anwendung in der @ApplicationPath-Annotation konfigurierte Pfad
- books Der Pfad für die BookRepository-Ressource, wie in der @Path-Anmerkung angegeben
JBoss AS 7 wird mit RESTeasy (einer Implementierung von JAX-RS) und Jackson (einem Java-JSON-Serialisierungs-Framework) ausgeliefert. Das macht JBoss AS 7 zu einer idealen Plattform für die Entwicklung von RESTful-Anwendungen: Es funktioniert out-of-the-box und basiert auf bekannten Open-Source-Projekten, so dass Sie den Container leicht an die spezifischen Anforderungen Ihrer Anwendung anpassen können.
Fazit
In diesem Blog haben wir eine Entwicklungsumgebung für JBoss AS 7 mit Maven, Eclipse und WTP eingerichtet und eine sehr einfache RESTful-Anwendung implementiert. Das Setup funktioniert ziemlich gut. Halten Sie Ausschau nach neuen Blogs, in denen ich das aktuelle Projekt weiter ausbauen werde, um mehr Aspekte von JBoss 7 und RESTful-Anwendungen zu zeigen.
Verfasst von
Maarten Winkels
Contact