3 min read

Javalin is a web framework for Java and Kotlin which is simple, lightweight, interoperable, and flexible.

With the major changes introduced in the codebase, the team has now announced the release of Javalin 2.0 RC3. Some of the updates include removal of some abstraction layers, using Set instead of List, removal of CookieBuilder, Javalin lambda replacing Javalin Jetty, and more.

Updates in the Javalin 2.0 RC3

Package structure improvements

The following table lists the packages whose structure have been updated in this release:

Javalin 1.7 Javalin 2.0 RC3
io.javalin.embeddedserver.jetty.websocket io.javalin.websocket
io.javalin.embeddedserver.Location io.javalin.staticfiles.Location
io.javalin.translator.json.JavalinJsonPlugin io.javalin.json.JavalinJson
io.javalin.translator.json.JavalinJacksonPlugin io.javalin.json.JavalinJackson
io.javalin.translator.template.JavalinXyzPlugin io.javalin.rendering.JavalinXyz
io.javalin.security.Role.roles io.javalin.security.SecurityUtil.roles
io.javalin.ApiBuilder io.javalin.apibuilder.ApiBuilder
io.javalin.ApiBuilder.EndpointGrooup io.javalin.apibuilder.EndpointGrooup

Changes in the server defaults

  • Earlier, when we wanted to customize our embedded server, we used to write the following:
app.embeddedServer(new EmbeddedJettyFactory(() -> new Server())) // v1

Now with the removal of embedded server abstraction, we can directly write this:

app.server(() -> new Server()) // v2
  • Since the static method Javalin.start(port) has been removed, use Javalin.create().start(0) instead.
  • defaultCharset() method has been removed

The following are enabled by default:

  • Dynamic gzip, turn it off with disableDynamicGzip()
  • Request-caching is now limited to 4kb
  • Server now has a LowResourceMonitor attached
  • URLs are now case-insensitive by default, meaning Javalin will treat /path and /Path as the same URL. This can be disabled with app.enableCaseSensitiveUrls().

Javalin lambda replaces Jetty WebSockets

Since Jetty WebSockets have limited functionality, it is now replaced with the Javalin lambda WebSockets.


This is an interface used to set per-endpoint authentication and authorization. Use Set instead of List. It now runs for every single request, but the default-implementation does nothing.


Context is the object, which provides you with everything needed to handle an http-request.

The following updates are introduced in Context:

  • ctx.uri() has been removed, it was a duplicate of ctx.path()
  • ctx.param() is replaced with ctx.pathParam()
  • ctx.xyzOrDefault(“key”) are changed to ctx.xyz(“key”, “default”)
  • ctx.next() has been removed
  • ctx.request() is now ctx.req
  • ctx.response() is now ctx.res
  • All ctx.renderXyz methods are now just ctx.render(), since the correct engine is chosen based on extension
  • ctx.charset(charset) has been removed
  • You can use the Cookie class in place of CookieBuilder, as it is now removed
  • Now List<T> is returned instead of Array<T>
  • Things that used to return nullable collections now return empty collections instead
  • Kotlin users can now do ctx.body<MyClass>() to deserialize json

In this article we looked at some of the major updates in Javalin 2.0. To know more, head over to their GitHub repository.

Read Next

Kotlin 1.3 M1 arrives with coroutines, and new experimental features like unsigned integer types

Top frameworks for building your Progressive Web Apps (PWA)

Kotlin/Native 0.8 recently released with safer concurrent programming


Please enter your comment!
Please enter your name here