jooby-project / jooby

The modular web framework for Java and Kotlin
https://jooby.io
Apache License 2.0
1.68k stars 199 forks source link

buffer: write(String str, int off, int len) doesn't work #3434

Closed ogrammer closed 1 month ago

ogrammer commented 1 month ago

I was previously using jooby 3.0.7, after updating to 3.1.0 various problems have appeared. I have also tried 3.1.1 before reverting to 3.0.7. There is a problem with the Gson module and the new DataBuffer, that for some things just does not work and for others it produces incorrect JSON serialization. Here is the error for when it does not work at all:

java.lang.IndexOutOfBoundsException: null
        at java.base/java.nio.CharBuffer.wrap(CharBuffer.java:544)
        at io.jooby.buffer.DataBufferWriter.write(DataBufferWriter.java:51)
        at com.google.gson.stream.JsonWriter.string(JsonWriter.java:764)
        at com.google.gson.stream.JsonWriter.value(JsonWriter.java:524)
        at com.google.gson.internal.bind.TypeAdapters$15.write(TypeAdapters.java:476)
        at com.google.gson.internal.bind.TypeAdapters$15.write(TypeAdapters.java:459)
        at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:73)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$2.write(ReflectiveTypeAdapterFactory.java:247)
        at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:490)
        at com.google.gson.internal.bind.ObjectTypeAdapter.write(ObjectTypeAdapter.java:184)
        at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:73)
        at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:99)
        at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:59)
        at com.google.gson.Gson.toJson(Gson.java:944)
        at com.google.gson.Gson.toJson(Gson.java:899)
        at com.google.gson.Gson.toJson(Gson.java:870)
        at io.jooby.gson.GsonModule.encode(GsonModule.java:115)
        at io.jooby.internal.HttpMessageEncoder.encode(HttpMessageEncoder.java:107)
        at io.jooby.DefaultContext.render(DefaultContext.java:467)
        at io.jooby.internal.handler.DefaultHandler.lambda$apply$e67b40fd$1(DefaultHandler.java:25)
        at io.jooby.Route$Filter.lambda$then$e67b40fd$1(Route.java:91)
        at io.jooby.internal.handler.WorkerHandler.lambda$apply$0(WorkerHandler.java:22)
        at io.jooby.internal.jetty.JettyContext.dispatch(JettyContext.java:344)
        at io.jooby.internal.jetty.JettyContext.dispatch(JettyContext.java:338)
        at io.jooby.internal.handler.WorkerHandler.lambda$apply$e67b40fd$1(WorkerHandler.java:19)
        at io.jooby.Route$Filter.lambda$then$e67b40fd$1(Route.java:91)
        at io.jooby.internal.RouterMatch.execute(RouterMatch.java:92)
        at io.jooby.Router$Match.execute(Router.java:76)
        at io.jooby.internal.jetty.JettyHandler.handle(JettyHandler.java:37)
        at org.eclipse.jetty.server.handler.ContextHandler.handle(ContextHandler.java:851)
        at org.eclipse.jetty.server.Server.handle(Server.java:179)
        at org.eclipse.jetty.server.internal.HttpChannelState$HandlerInvoker.run(HttpChannelState.java:635)
        at org.eclipse.jetty.server.internal.HttpConnection.onFillable(HttpConnection.java:411)
        at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:322)
        at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:99)
        at org.eclipse.jetty.io.ssl.SslConnection$SslEndPoint.onFillable(SslConnection.java:574)
        at org.eclipse.jetty.io.ssl.SslConnection.onFillable(SslConnection.java:390)
        at org.eclipse.jetty.io.ssl.SslConnection$2.succeeded(SslConnection.java:150)
        at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:99)
        at org.eclipse.jetty.io.SelectableChannelEndPoint$1.run(SelectableChannelEndPoint.java:53)
        at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.runTask(AdaptiveExecutionStrategy.java:478)
        at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.consumeTask(AdaptiveExecutionStrategy.java:441)
        at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.tryProduce(AdaptiveExecutionStrategy.java:293)
        at org.eclipse.jetty.util.thread.strategy.AdaptiveExecutionStrategy.run(AdaptiveExecutionStrategy.java:201)
        at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:311)
        at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:979)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.doRunJob(QueuedThreadPool.java:1209)
        at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:1164)
        at java.base/java.lang.Thread.run(Thread.java:1583)

Maybe the fix for this will fix the issue with incorrect serialization too

No problems: 3.0.7 and 3.0.9

Broken: 3.1.0 and 3.1.1