Dropwizard als REST-App-Server

Seite 2: Hello World

Inhaltsverzeichnis

Die Umsetzung der etablierten "Hello World"-Anwendung mit Dropwizard zeigt den grundsätzlichen Aufbau einer entsprechenden App. Das Beispiel soll bei einem HTTP-GET-Request die Meldung "Hello World" als JSON-Dokument zurückgeben.

Am Anfang steht die Entity-Klasse, die bewusst einfach gehalten ist:

public class HelloWorld {
public final String greeting = "Hello World!";
}

Der folgende Auszug zeigt die für die Abarbeitung eines HTTP-GET-Requests zuständige JAX-RS-Ressource.

@Path("/")
@Produces(MediaType.APPLICATION_JSON)
public class HelloWorldResource {
@GET
public HelloWorld sayHello() {
return new HelloWorld();
}
}

Wer mit JAX-RS vertraut ist, weiß, dass eine JAX-RS-Anwendung entweder von javax.ws.rs.core.Application erben kann oder eine entsprechend konfigurierte
web.xml benötigt. Das ist bei Dropwizard nicht notwendig, da es die Jersey-Umgebung bereitstellt, der nur noch die Resource-Klassen bekannt zu machen sind:

public class MinimalApplication
extends Application<Configuration>
{
public static void main(String[] args) throws Exception {
new MinimalApplication().run(args);
}

@Override
public void initialize(Bootstrap<Configuration> bootstrap) {
}

@Override
public void run(Configuration configuration,
Environment environment) {
environment.jersey().register(HelloWorldResource.class);
}
}

Jede eigene Application-Klasse muss von io.dropwizard.Application erben und als Typparameter die verwendete Konfigurationsklasse übergeben. Da für die Hello-World-Anwendung keine weiteren Einstellungen notwendig sind, kann Dropwizard direkt die Configuration-Klasse übernehmen, die die grundlegenden Konfigurationseinstellungen bereitstellt, ohne dass eine Konfigurationsdatei notwendig ist.

Selbst muss der Entwickler nur die Methoden initialize() und run() implementieren. Erstere erlaubt Eingriffe in den Boostrapping-Prozess, während run() die eigentliche Anwendung startet. Die Methode hat dabei Zugriff auf die gewählte Konfigurationsklasse und die Laufzeitumgebung über die Environment-Klasse. Über sie gewährt Dropwizard unter anderem Zugriff auf Jersey, Metrics und die eigene Laufzeitumgebung. Die ebenfalls enthaltene Methode main startet die Anwendung und wird später bei der Erzeugung des Fat Jars als Main-Methode im Manifest des Jars eingetragen. Daher ist sie beim späteren Start nicht mehr explizit anzugeben.

Um nun aus den eigenen Klassen und allen verwendeten Bibliotheken zu einem ausführbaren Fat Jar zu kommen, kommt das Maven-Plug-in Shade zum Einsatz. Es schnürt aus den eigenen Klassen und allen Maven-Abhängigkeiten des Maven-Projekts ein Fat Jar und trägt die eigene Application-Klasse als Main-Klasse ein.

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<configuration>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/*.SF</exclude>
<exclude>META-INF/*.DSA</exclude>
<exclude>META-INF/*.RSA</exclude>
</excludes>
</filter>
</filters>
</configuration>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<transformers>
<transformer implementation=
"org.apache.maven.plugins.shade.↩
resource.ServicesResourceTransformer"/>
<transformer implementation=
"org.apache.maven.plugins.shade.↩
resource.ManifestResourceTransformer"/>
<mainClass>net.sweblog.hd.dropwizard.minimal.↩
MinimalApplication</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>

Nach einem mvn clean install lässt sich die Anwendung via java -jar pfad/zum/fatjar.jar server starten. In der Default-Konfiguration bindet sich Dropwizard an Port 8080, sodass sich die Willkommensnachricht mit cURL abholen lässt:

$ curl -X GET http://localhost:8080; echo
{"greeting":"Hello World!"}