Das beste aus beiden Welten?

Javalin – Ein Web Framwork für Java und Kotlin

Marcel Richters
Javalin throw

© Shutterstock.com / hrynchak

Mit Javalin sollen sich Apps für Kotlin und Java gleichermaßen einfach bauen lassen – und das mit nur einem Framework. Javalin basiert auf Jetty-Servern und soll vor allem leichtgewichtig und übersichtlich sein. Dabei ist Javalin mehr Bibliothek als Framework, wie die Entwickler betonen.

Kotlin hat sich innerhalb kurzer Zeit zur zweitwichtigsten Sprache für Android gemausert – neben Java. Nur konsequent also, dass es für beide Sprachen ein gemeinsames Web Framework gibt: Javalin. Der Name erinnert an Javelin, zu deutsch „Speer“. Mit dem Framework – das laut Entwicklern eher eine REST-API-Bibliothek ist – sollen sich Apps für Kotlin und Java auf genau dieselbe Art und Weise entwickeln lassen. Javalin baut auf Jetty-Servern auf und hat als Fork von SparkJava angefangen und wurde von Koa.js beeinflusst.

Als Gründe für die Nutzung von Javalin führen die Entwickler vor allem die Einfachheit und das geringe Gewicht des Frameworks an. So sei die Erweiterung von Klassen gar nicht und die Implementierung von Interfaces nur sehr selten notwendig. Außerdem verfügt Javalin nur über wenige tausend Zeilen Code, die auf Jetty aufsetzen, was laut Angaben der Entwickler die Performance fast so gut macht, wie bei purem Jetty. Alle Handler und Mapper sind leer und arbeiten rein nach Kontext und die APIs sind für Kotlin und Java „fast identisch“, so das Versprechen, die Jetty-Server sind dabei vollständig anpassbar.

Ein Blick auf den Vergleich der API-Struktur und Serverkonfiguration bei Kotlin und Java macht deutlich, wie ähnlich sich beide sind:

Kotlin

val app = Javalin.create().apply {
    enableStaticFiles("/public")
    enableStandardRequestLogging()
    port(port)
}.start()

app.routes {
    path("users") {
        get(UserController::getAllUserIds)
        post(UserController::createUser)
        path(":user-id") {
            get(UserController::getUser)
            patch(UserController::updateUser)
            delete(UserController::deleteUser)
        }
    }
}

Java

Javalin app = Javalin.create()
    .enableStaticFiles("/public")
    .enableStandardRequestLogging()
    .port(port)
    .start();

app.routes(() -> {
    path("users"(() -> {
        get(UserController::getAllUserIds);
        post(UserController::createUser);
        path(":user-id"(() -> {
            get(UserController::getUser);
            patch(UserController::updateUser);
            delete(UserController::deleteUser);
        });
    });
});

Javalin 1.6.0

Das Projekt wird derzeit aktiv vorangetrieben und es erscheinen im Schnitt zwei Releases pro Monat. Die aktuelle Version (1.6.0) bringt die Möglichkeit, auch asynchrone Requests zu implementieren. Dieser Schritt hat einige Zeit in Anspruch genommen, da es knifflig gewesen sei, ihn zu verwirklichen, wie es in den Release Notes heißt. Wer Javalin schon nutzt, muss sich keine Sorgen machen: Die Implementierung ist rückwärtskombatibel.

Um asynchrone Request einzubauen, ist es notwendig, CompletableFuture<string> oder CompletableFuture<InputStream> als Resultat anzugeben:

import io.javalin.Javalin

fun main(args: Array<String>) {
    val app = Javalin.start(7000)
    app.get("/") { ctx -> ctx.result(getFuture()) }
}

// hopefully your future is less pointless than this:
private fun getFuture() = CompletableFuture<String>().apply {
    Executors.newSingleThreadScheduledExecutor().schedule({ this.complete("Hello World!") }, 1, TimeUnit.SECONDS)
}

Die result(getFuture()) lassen sich nur auf Enpoint-Handler wie get, post, put und so weiter anwenden. Die After, Exception und Error Handler laufen weiter, wie es sein sollte, nachdem der Future-Handler gelöst oder abgelehnt wurde. Das Path Matching nutzt zudem ab Version 1.6.0 eine EnumMap, um das Durchsuchen der verschiedenen HTTP-Methoden (get/post/put/etc.) zu splitten. Hierdurch profitieren in Sachen Performance vor allem Apps mit vielen Pfaden (Routes).

Auf der Homepage des Frameworks bieten die Entwickler diverse Tutorials für beide Sprachen an. Vom Erstellen von Dashboards in Java bis zum Setup von Gradle in Kotlin. Das GitHub-Repository bietet die Möglichkeit, für weitere Tutorials ein Pull Request zu erstellen.

Geschrieben von
Marcel Richters
Marcel Richters
Marcel hat Soziologie an der Goethe-Universität in Frankfurt am Main studiert und danach als E-Commerce-Manager gearbeitet. Seit Februar 2018 unterstützt er das Team von JAXenter als Redakteur. Daneben arbeitet er als freier Journalist in der Mainmetropole.
Kommentare

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

avatar
400
  Subscribe  
Benachrichtige mich zu: