Skip to content

v7 (alpha 2) has an implicit dependency on jackson #2509

@fahrradflucht

Description

@fahrradflucht

Actual behavior (the bug)
A minimal example like this:

fun main() {
    val app = Javalin.create {
        it.routes.get("/") { ctx -> ctx.result("Hello World") }
    }
        .start(7070)
}

and with minimal dependencies

implementation("io.javalin:javalin:7.0.0-alpha.2")
implementation("org.slf4j:slf4j-simple:2.0.17")

throws a 500 after receiving the first request and emits this exception:

[JettyServerThreadPool-33] ERROR io.javalin.Javalin - Fatal error occurred while servicing http-request
java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ObjectMapper
	at io.javalin.json.JavalinJackson.<init>(JavalinJackson.kt:30)
	at io.javalin.config.JavalinState.jsonMapper$lambda$0(JavalinState.kt:74)
	at kotlin.UnsafeLazyImpl.getValue(Lazy.kt:100)
	at io.javalin.http.servlet.JavalinServletContextConfig$Companion.of(JavalinServletContext.kt:61)
	at io.javalin.http.servlet.JavalinServlet.servletContextConfig_delegate$lambda$0(JavalinServlet.kt:27)
	at kotlin.UnsafeLazyImpl.getValue(Lazy.kt:100)
	at io.javalin.http.servlet.JavalinServlet.getServletContextConfig(JavalinServlet.kt:27)
	at io.javalin.http.servlet.JavalinServlet.handle(JavalinServlet.kt:36)
	at io.javalin.http.servlet.JavalinServlet.service(JavalinServlet.kt:30)
	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614)
	at io.javalin.jetty.JavalinJettyServlet.service(JavalinJettyServlet.kt:50)
	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:614)
	at org.eclipse.jetty.ee10.servlet.ServletHolder.handle(ServletHolder.java:752)
	at org.eclipse.jetty.ee10.servlet.ServletHandler$ChainEnd.doFilter(ServletHandler.java:1620)
	at org.eclipse.jetty.ee10.servlet.ServletHandler$MappedServlet.handle(ServletHandler.java:1554)
	at org.eclipse.jetty.ee10.servlet.ServletChannel.dispatch(ServletChannel.java:807)
	at org.eclipse.jetty.ee10.servlet.ServletChannel.handle(ServletChannel.java:442)
	at org.eclipse.jetty.ee10.servlet.ServletHandler.handle(ServletHandler.java:469)
	at org.eclipse.jetty.ee10.servlet.SessionHandler.handle(SessionHandler.java:719)
	at org.eclipse.jetty.server.handler.ContextHandler.handle(ContextHandler.java:1220)
	at org.eclipse.jetty.server.Handler$Wrapper.handle(Handler.java:794)
	at org.eclipse.jetty.server.handler.EventsHandler.handle(EventsHandler.java:81)
	at org.eclipse.jetty.server.Server.handle(Server.java:195)
	at org.eclipse.jetty.server.internal.HttpChannelState$HandlerInvoker.run(HttpChannelState.java:680)
	at org.eclipse.jetty.server.internal.HttpConnection.onFillable(HttpConnection.java:411)
	at org.eclipse.jetty.server.internal.HttpConnection$FillableCallback.succeeded(HttpConnection.java:1809)
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105)
	at org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:54)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:1009)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1239)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1194)
	at java.base/java.lang.Thread.run(Thread.java:1474)
Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.ObjectMapper
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:580)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:490)
	... 32 more
Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.databind.ObjectMapper

Expected behavior
Not sure - maybe this is an intended change for v7 that isn't documented yet, but otherwise, like on v6, I would have expected to not need Jackson if I don't use JSON features.

To Reproduce
See above

Additional context
I was looking at the code to see how this was introduced and to be honest my question is more "how did this ever work?" 😅 - the object mapper usage isn't really lazy, neither on v6 nor on v7...

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions