Skip to content

Dynamic schema configration fails with InvalidDefinitionException when there're no endpoints covered with @OpenApi #237

@brys0

Description

@brys0

Actual behavior (the bug)
When registering OpenApiPlugin with a definition configuration (even if it is empty/blank) trying to access the openapi.json documentation causes a server error

com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No value type configured for ObjectReader
 at [Source: UNKNOWN; byte offset: #UNKNOWN]
	at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67)
	at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1887)
	at com.fasterxml.jackson.databind.ObjectReader._findRootDeserializer(ObjectReader.java:2397)
	at com.fasterxml.jackson.databind.ObjectReader._bindAndClose(ObjectReader.java:2125)
	at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1744)
	at io.javalin.openapi.plugin.OpenApiPlugin.applyConfigurationTo(OpenApiPlugin.kt:47)
	at io.javalin.openapi.plugin.OpenApiPlugin.access$applyConfigurationTo(OpenApiPlugin.kt:12)
	at io.javalin.openapi.plugin.OpenApiPlugin$createDocumentation$1.invoke(OpenApiPlugin.kt:37)
	at io.javalin.openapi.plugin.OpenApiPlugin$createDocumentation$1.invoke(OpenApiPlugin.kt:25)
	at kotlin.SynchronizedLazyImpl.getValue(LazyJVM.kt:74)
	at io.javalin.openapi.plugin.OpenApiHandler.handle(OpenApiHandler.kt:15)
	at io.javalin.router.Endpoint.handle(Endpoint.kt:52)
	at io.javalin.router.ParsedEndpoint.handle(ParsedEndpoint.kt:15)
	at io.javalin.http.servlet.DefaultTasks.HTTP$lambda$9$lambda$7$lambda$6(DefaultTasks.kt:52)
	at io.javalin.http.servlet.JavalinServlet.handleTask(JavalinServlet.kt:99)
	at io.javalin.http.servlet.JavalinServlet.handleSync(JavalinServlet.kt:64)
	at io.javalin.http.servlet.JavalinServlet.handle(JavalinServlet.kt:50)
	at io.javalin.http.servlet.JavalinServlet.service(JavalinServlet.kt:30)
	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:587)
	at io.javalin.jetty.JavalinJettyServlet.service(JavalinJettyServlet.kt:52)
	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:587)
	at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:764)
	at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:529)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:221)
	at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1580)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:221)
	at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1381)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:176)
	at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:484)
	at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1553)
	at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:174)
	at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1303)
	at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:129)
	at org.eclipse.jetty.server.handler.StatisticsHandler.handle(StatisticsHandler.java:173)
	at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:122)
	at org.eclipse.jetty.server.Server.handle(Server.java:563)
	at org.eclipse.jetty.server.HttpChannel$RequestDispatchable.dispatch(HttpChannel.java:1598)
	at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:753)
	at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:501)
	at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:287)
	at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:314)
	at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:100)
	at org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:53)
	at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:969)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1194)
	at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1149)
	at java.base/java.lang.Thread.run(Thread.java:1583)

Expected behavior
There shouldn't be an error for adding a definition configuration

To Reproduce
build.gradle.kts

dependencies {
 val javalin = "6.4.0"
    implementation("io.javalin:javalin:$javalin")
    implementation("io.javalin.community.openapi:javalin-openapi-plugin:$javalin")
    implementation("io.javalin.community.openapi:javalin-redoc-plugin:$javalin")
    kapt("io.javalin.community.openapi:openapi-annotation-processor:$javalin")
}

open api setting configuration

 conf.registerPlugin(OpenApiPlugin { openapi ->
                openapi
                    .withDocumentationPath("/docs/openapi.json")
                    .withDefinitionConfiguration { version, def ->  /* Just existing causes an error **/ }
            })

Additional context
Add any other context about the bug here

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    Status

    ✅ Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions