Dynamische Serveranwendungen

Persistenz und JSON APIs

Gunnar Wagenknecht

Nachdem das Projekt steht, kann der Server gestartet werden. Dazu reicht es aus, die Launch-Konfiguration aus dem ersten Teil zu starten. Das Bundle ist dann sofort verfügbar. Allerdings gibt es noch ein kleines Problem in der Kombination OSGi DS und Gemini-JPA-1.0-Release. Persistence Bundles, die bei Bedarf automatisch gestartet werden sollen (Bundle-ActivationPolicy: lazy), werden nicht gestartet. Das führt dazu, dass die JPA-Implementierung des Grußbotschaftenservice nicht automatisch verfügbar ist. Abhilfe schafft ein manuelles Starten per OSGi-Konsole (Abb. 2) oder ein erzwungener Start in der Launch-Konfiguration. Ohnehin empfiehlt sich ein Optimieren der Startleveleinstellungen, da EclipseLink den Bytecode der JPA-Entitätenklassen anpassen möchte (Byte Code Weaving). Falls ein Persistence Bundle bereits gestartet ist, führt das dazu, dass die Klassen des Bundles neu geladen werden (Packages Refresh). Es wird sozusagen gestoppt und wieder gestartet. Das kann zu ungewolltem Verhalten führen. Allerdings ist das Verhalten normal und kann beispielsweise auch zur Laufzeit auftreten, wenn ein Bundle aktualisiert wird. Um das für die Beispiele zu vermeiden, können die Startlevels wie in Abbildung 3 dargestellt gesetzt werden.

Abb. 2: JPA Bundle manuell starten

Abb. 3: Startleveleinstellungen für JPA

Wenn der Server gestartet ist, kann die JAX RS GreetingsResource aus dem ersten Teil im Browser geöffnet werden (http://localhost:8080/hello/greetings) und Grußbotschaften in der Datenbank abspeichern (die MongoDB-Datenbank muss natürlich auch gestartet sein). Diese Grußbotschaften überleben so auch einen Neustart des Servers.

JAX RS mit JSON

Bereits im ersten Teil wurde gezeigt, wie der JAX-RS-Standard in OSGi genutzt werden kann, um relativ einfach RESTful Web Services zu erstellen. Dazu wurde ein Bundle mit ein paar JAX-RS-Ressourcen erstellt und eine Gyrex-Webanwendung per OSGi DS registriert, die dann dynamisch einem beliebigen URL zugeordnet werden konnte. Allerdings wurde bei den Beispielen die Ausgabe selbst implementiert. Nun bietet der JAX-RS-Standard eine Möglichkeit, dass die Ein- und Ausgabe auch durch eine Konvertierung von/zu Java-Objekten erfolgen kann. Statt die Ausgabe selber zu erzeugen, kann ein beliebiges Objekt von einer JAX-RS-Ressource als Rückgabewert geliefert werden, das dann mittels eines Konverters (JAX RS MessageBodyWriter) umgewandelt wird. Auch hier hat EclipseRT ein passendes Projekt im Stack: EclipseLink MOXy liefert Konverter von und nach XML und/oder JSON. Dabei können JAXB-Annotationen an den Objekten genutzt werden, um die Konvertierung zu beeinflussen.

Im finalen MOXy-2.4-Release, das für Ende Juni 2012 erwartet wird. Im aktuellen Release Kandidaten ist eine fertige Implementierung enthalten. Falls der Konverter zur Laufzeit verfügbar ist, wird er automatisch von der Gyrex-JAX-RS-Applikation geladen und bei Bedarf aktiviert. Dazu muss allerdings die Target Platform aus dem ersten Teil, mit einem aktuellen EclipseLink 2.4 und einem Gyrex JAX RS Add-on aktualisiert werden. Wer mit der Target Platform unverändert weiterarbeiten möchte, kann den Konverter auch schnell selber implementieren. Der Code dafür ist online abrufbar [2]. Der Konverter sollte im selben Projekt wie die JAX-RS-Ressourcen abgelegt werden. Dadurch wird er zusammen mit den Ressourcen automatisch gefunden und aktiviert. Der Übersicht halber wird ein neues OSGi-Bundle-Projekt angelegt. Dort wird eine Klasse für das Modell (Greeting) und eine Klasse für die API-Ressource (JsonGreetingResource) erstellt. Die Modellklasse wird dabei in einem eigenen Paket abgelegt. Wichtig ist, dass im selben Paket auch noch eine jaxb.properties-Datei erstellt wird. Darin wird JAXB mitgeteilt, dass die EclipseLink-JAXB-Implementierung genutzt werden soll, statt der Standardimplementierung. Die EclipseLink-MOXy-Konverter können nur mit der EclipseLink-JAXB-Implementierung zusammen funktionieren.

Geschrieben von
Gunnar Wagenknecht
Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.