As of right now it appears that Jackson / Finatra Jackson Module is not capable of deserializing type aliases. Whenever I try to do so I get a ClassNotFoundException. Is there any way I can get around this limitation? If not, is it possible to swap out Jackson for a different json library (like spray) in finatra?
--
You received this message because you are subscribed to the Google Groups "finatra-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to finatra-users+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.
Lets say I define the following type alias in the package object:
type ID = Int
And then in the same package I create a file with the following code:
case class IdExample(id: ID)
object TypeAliasTest {
def main(args: Array[String]): Unit = {
val mapper = FinatraObjectMapper.create()
val cc = IdExample(5)
val str = mapper.writeValueAsString(cc)
println(str)
val parsedCC = mapper.parse[IdExample](str)
println(parsedCC)
}
}
If I run this I will get the following output:
{"id":5}
Exception in thread "main" java.lang.ClassNotFoundException: com.sbaldwin.json.package.ID
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at com.twitter.finatra.json.internal.caseclass.reflection.CaseClassSigParser$.loadClass(CaseClassSigParser.scala:68)
...
...
...
However if I replace
val mapper = FinatraObjectMapper.create()
with
val mapper = new ObjectMapper() with ScalaObjectMapper
mapper.registerModule(DefaultScalaModule)
and
val parsedCC = mapper.parse[IdExample](str)
with
val parsedCC = mapper.readValue[IdExample](str)
then the code works and prints the following:
{"id":5}
IdExample(5)
I get the same ClassNotFoundException when I define a custom Request case class (containing a type alias) for use in a Finatra Controller.
For example, if I define:
case class IdExample(id: ID)
and then inside my controller define the following endpoint:
post("/test/?", "Test")
{
request: IdExample => {
response.ok(request.id)
}
}
and then run the server and send a post http request with a body of
{
"id": 5
}
I will get the ClassNotFoundException.
Note that all of these examples work fine if I redefine the case classes to use an Int instead of the ID type alias.
Is there any way I can fix this behavior?
P.S. How can I format code in these google groups messages?
java.lang.ClassNotFoundException: com.sbaldwin.service.package.ID
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at com.twitter.finatra.json.internal.caseclass.reflection.CaseClassSigParser$.loadClass(CaseClassSigParser.scala:68)
at com.twitter.finatra.json.internal.caseclass.reflection.ScalaType.<init>(ScalaType.scala:25)
at com.twitter.finatra.json.internal.caseclass.reflection.ConstructorParam.<init>(ConstructorParam.scala:7)
at com.twitter.finatra.json.internal.caseclass.reflection.CaseClassSigParser$.$anonfun$parseConstructorParams$2(CaseClassSigParser.scala:35)
at scala.collection.TraversableLike.$anonfun$flatMap$1(TraversableLike.scala:241)
at scala.collection.immutable.List.foreach(List.scala:389)
at scala.collection.TraversableLike.flatMap(TraversableLike.scala:241)
at scala.collection.TraversableLike.flatMap$(TraversableLike.scala:238)
at scala.collection.immutable.List.flatMap(List.scala:352)
at com.twitter.finatra.json.internal.caseclass.reflection.CaseClassSigParser$.parseConstructorParams(CaseClassSigParser.scala:32)
at com.twitter.finatra.json.internal.caseclass.jackson.CaseClassField$.createFields(CaseClassField.scala:37)
at com.twitter.finatra.json.internal.caseclass.jackson.FinatraCaseClassDeserializer.<init>(FinatraCaseClassDeserializer.scala:47)
at com.twitter.finatra.json.internal.caseclass.jackson.FinatraCaseClassDeserializers.findBeanDeserializer(FinatraCaseClassDeserializers.scala:23)
at com.twitter.finatra.json.internal.caseclass.jackson.FinatraCaseClassDeserializers.findBeanDeserializer(FinatraCaseClassDeserializers.scala:10)
at com.fasterxml.jackson.databind.deser.BasicDeserializerFactory._findCustomBeanDeserializer(BasicDeserializerFactory.java:1666)
at com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:132)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:403)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:349)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264)
at com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCacheValueDeserializer(DeserializerCache.java:244)
at com.fasterxml.jackson.databind.deser.DeserializerCache.findValueDeserializer(DeserializerCache.java:142)
at com.fasterxml.jackson.databind.DeserializationContext.findRootValueDeserializer(DeserializationContext.java:476)
at com.fasterxml.jackson.databind.ObjectReader._prefetchRootDeserializer(ObjectReader.java:1902)
at com.fasterxml.jackson.databind.ObjectReader.<init>(ObjectReader.java:185)
at com.fasterxml.jackson.databind.ObjectMapper._newReader(ObjectMapper.java:652)
at com.fasterxml.jackson.databind.ObjectMapper.readerFor(ObjectMapper.java:3372)
at com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper.readerFor(ScalaObjectMapper.scala:267)
at com.fasterxml.jackson.module.scala.experimental.ScalaObjectMapper.readerFor$(ScalaObjectMapper.scala:266)
at com.twitter.finatra.json.modules.FinatraJacksonModule$$anon$1.readerFor(FinatraJacksonModule.scala:73)
at com.twitter.finatra.json.FinatraObjectMapper.reader(FinatraObjectMapper.scala:54)
at com.twitter.finatra.http.internal.marshalling.FinatraDefaultMessageBodyReader.parse(FinatraDefaultMessageBodyReader.scala:27)
at com.twitter.finatra.http.internal.marshalling.MessageBodyManager.read(MessageBodyManager.scala:81)
at com.twitter.finatra.http.internal.marshalling.CallbackConverter.$anonfun$createRequestCallback$2(CallbackConverter.scala:51)
at com.twitter.finatra.http.internal.marshalling.CallbackConverter.$anonfun$createResponseCallback$18(CallbackConverter.scala:123)
at com.twitter.finagle.Service$$anon$2.apply(Service.scala:28)
at com.twitter.finagle.Service$$anon$1.apply(Service.scala:16)
at com.twitter.finatra.http.filters.ExceptionMappingFilter.apply(ExceptionMappingFilter.scala:17)
at com.twitter.finatra.http.filters.ExceptionMappingFilter.apply(ExceptionMappingFilter.scala:13)
at com.twitter.finagle.Filter$$anon$1.apply(Filter.scala:80)
at com.twitter.finagle.Service$$anon$1.apply(Service.scala:16)
at com.twitter.finagle.Service$$anon$1.apply(Service.scala:16)
at com.twitter.finatra.http.filters.HttpNackFilter.apply(HttpNackFilter.scala:28)
at com.twitter.finatra.http.filters.HttpNackFilter.apply(HttpNackFilter.scala:18)
at com.twitter.finagle.Filter$$anon$1.apply(Filter.scala:80)
at com.twitter.finagle.Service$$anon$1.apply(Service.scala:16)
at com.twitter.finatra.http.filters.ExceptionMappingFilter.apply(ExceptionMappingFilter.scala:17)
at com.twitter.finatra.http.filters.ExceptionMappingFilter.apply(ExceptionMappingFilter.scala:13)
at com.twitter.finagle.Filter$$anon$1.apply(Filter.scala:80)
at com.twitter.finagle.Service$$anon$1.apply(Service.scala:16)
at com.twitter.finatra.http.filters.HttpResponseFilter.apply(HttpResponseFilter.scala:36)
at com.twitter.finatra.http.filters.HttpResponseFilter.apply(HttpResponseFilter.scala:19)
at com.twitter.finagle.Filter$$anon$1.apply(Filter.scala:80)
at com.twitter.finagle.Service$$anon$1.apply(Service.scala:16)
at com.twitter.finatra.http.filters.AccessLoggingFilter.apply(AccessLoggingFilter.scala:21)
at com.twitter.finatra.http.filters.AccessLoggingFilter.apply(AccessLoggingFilter.scala:11)
at com.twitter.finagle.Filter$$anon$1.apply(Filter.scala:80)
at com.twitter.finagle.Service$$anon$1.apply(Service.scala:16)
at com.twitter.finatra.http.filters.StatsFilter.apply(StatsFilter.scala:86)
at com.twitter.finatra.http.filters.StatsFilter.apply(StatsFilter.scala:61)
at com.twitter.finagle.Filter$$anon$1.apply(Filter.scala:80)
at com.twitter.finagle.Filter$AndThen.apply(Filter.scala:156)
at com.twitter.finatra.filters.MergedFilter.apply(MergedFilter.scala:12)
at com.twitter.finagle.Filter$$anon$1.apply(Filter.scala:80)
at com.twitter.finagle.Service$$anon$1.apply(Service.scala:16)
at com.twitter.finatra.http.filters.TraceIdMDCFilter.apply(TraceIdMDCFilter.scala:17)
at com.twitter.finagle.Filter$$anon$1.apply(Filter.scala:80)
at com.twitter.finagle.Service$$anon$1.apply(Service.scala:16)
at com.twitter.finatra.http.filters.LoggingMDCFilter.apply(LoggingMDCFilter.scala:15)
at com.twitter.finagle.Filter$$anon$1.apply(Filter.scala:80)
at com.twitter.finagle.Filter$$anon$1.apply(Filter.scala:79)
at com.twitter.finatra.http.internal.routing.Route.handleMatch(Route.scala:78)
at com.twitter.finatra.http.internal.routing.Routes.handle(Routes.scala:50)
at com.twitter.finatra.http.internal.routing.RoutingService.route(RoutingService.scala:36)
at com.twitter.finatra.http.internal.routing.RoutingService.apply(RoutingService.scala:30)
at com.twitter.finatra.http.internal.routing.RoutingService.apply(RoutingService.scala:11)
at com.twitter.finagle.ServiceProxy.apply(ServiceProxy.scala:12)
at com.twitter.finagle.Service$$anon$1.apply(Service.scala:16)
at com.twitter.finagle.server.ThreadUsage$ThreadUsageFilter.apply(ThreadUsage.scala:124)
at com.twitter.finagle.Filter$$anon$1.apply(Filter.scala:80)
at com.twitter.finagle.Service$$anon$1.apply(Service.scala:16)
at com.twitter.finagle.tracing.ServerDestTracingProxy$$anon$1.apply(DestinationTracing.scala:31)
at com.twitter.finagle.Filter$$anon$1.apply(Filter.scala:80)
at com.twitter.finagle.Service$$anon$1.apply(Service.scala:16)
at com.twitter.finagle.filter.DtabStatsFilter.apply(DtabStatsFilter.scala:37)
at com.twitter.finagle.Filter$$anon$1.apply(Filter.scala:80)
at com.twitter.finagle.Service$$anon$1.apply(Service.scala:16)
at com.twitter.finagle.service.StatsFilter.apply(StatsFilter.scala:172)
at com.twitter.finagle.Filter$$anon$1.apply(Filter.scala:80)
at com.twitter.finagle.Service$$anon$1.apply(Service.scala:16)
at com.twitter.finagle.filter.ExceptionSourceFilter.apply(ExceptionSourceFilter.scala:50)
at com.twitter.finagle.Filter$$anon$1.apply(Filter.scala:80)
at com.twitter.finagle.Service$$anon$1.apply(Service.scala:16)
at com.twitter.finagle.filter.MkJvmFilter$$anon$1.apply(JvmFilter.scala:28)
at com.twitter.finagle.Filter$$anon$1.apply(Filter.scala:80)
at com.twitter.finagle.Service$$anon$1.apply(Service.scala:16)
at com.twitter.finagle.filter.ServerStatsFilter.apply(ServerStatsFilter.scala:55)
at com.twitter.finagle.Filter$$anon$1.apply(Filter.scala:80)
at com.twitter.finagle.Service$$anon$1.apply(Service.scala:16)
at com.twitter.finagle.tracing.AnnotatingTracingFilter.apply(TraceInitializerFilter.scala:125)
at com.twitter.finagle.Filter$$anon$1.apply(Filter.scala:80)
at com.twitter.finagle.Service$$anon$1.apply(Service.scala:16)
at com.twitter.finagle.http.filter.HttpNackFilter.apply(HttpNackFilter.scala:116)
at com.twitter.finagle.http.filter.HttpNackFilter.apply(HttpNackFilter.scala:81)
at com.twitter.finagle.Filter$$anon$1.apply(Filter.scala:80)
at com.twitter.finagle.Service$$anon$1.apply(Service.scala:16)
at com.twitter.finagle.Service$$anon$1.apply(Service.scala:13)
at com.twitter.finagle.http.HttpServerTraceInitializer.$anonfun$make$3(HttpServerTraceInitializer.scala:20)
at com.twitter.finagle.http.TraceInfo$.$anonfun$letTraceIdFromRequestHeaders$1(TraceInfo.scala:58)
at com.twitter.util.Local.let(Local.scala:144)
at com.twitter.finagle.context.MarshalledContext.letLocal(MarshalledContext.scala:157)
at com.twitter.finagle.context.MarshalledContext.let(MarshalledContext.scala:90)
at com.twitter.finagle.tracing.Trace$.letId(Trace.scala:182)
at com.twitter.finagle.http.TraceInfo$.letTraceIdFromRequestHeaders(TraceInfo.scala:56)
at com.twitter.finagle.http.HttpServerTraceInitializer.$anonfun$make$2(HttpServerTraceInitializer.scala:20)
at com.twitter.util.Local.let(Local.scala:144)
at com.twitter.finagle.context.LocalContext.letLocal(LocalContext.scala:53)
at com.twitter.finagle.context.LocalContext.let(LocalContext.scala:24)
at com.twitter.finagle.tracing.Trace$.letTracer(Trace.scala:200)
at com.twitter.finagle.http.HttpServerTraceInitializer.$anonfun$make$1(HttpServerTraceInitializer.scala:20)
at com.twitter.finagle.Filter$$anon$6.apply(Filter.scala:253)
at com.twitter.finagle.Filter$$anon$1.apply(Filter.scala:80)
at com.twitter.finagle.Service$$anon$1.apply(Service.scala:16)
at com.twitter.finagle.filter.MonitorFilter.apply(MonitorFilter.scala:66)
at com.twitter.finagle.Filter$$anon$1.apply(Filter.scala:80)
at com.twitter.finagle.Service$$anon$1.apply(Service.scala:16)
at com.twitter.finagle.filter.PayloadSizeFilter.apply(PayloadSizeFilter.scala:32)
at com.twitter.finagle.Filter$$anon$1.apply(Filter.scala:80)
at com.twitter.finagle.Service$$anon$1.apply(Service.scala:16)
at com.twitter.finagle.http.filter.DtabFilter.apply(DtabFilter.scala:25)
at com.twitter.finagle.http.filter.DtabFilter.apply(DtabFilter.scala:12)
at com.twitter.finagle.Filter$$anon$1.apply(Filter.scala:80)
at com.twitter.finagle.Service$$anon$1.apply(Service.scala:16)
at com.twitter.finagle.http.filter.ServerContextFilter.$anonfun$apply$1(ContextFilter.scala:15)
at com.twitter.util.Local.let(Local.scala:144)
at com.twitter.finagle.context.MarshalledContext.letLocal(MarshalledContext.scala:157)
at com.twitter.finagle.context.MarshalledContext.let(MarshalledContext.scala:104)
at com.twitter.finagle.http.codec.HttpContext$.read(HttpContext.scala:77)
at com.twitter.finagle.http.filter.ServerContextFilter.apply(ContextFilter.scala:15)
at com.twitter.finagle.http.filter.ServerContextFilter.apply(ContextFilter.scala:12)
at com.twitter.finagle.Filter$$anon$1.apply(Filter.scala:80)
at com.twitter.finagle.Service$$anon$1.apply(Service.scala:16)
at com.twitter.finagle.http.codec.ResponseConformanceFilter$.apply(ResponseConformanceFilter.scala:26)
at com.twitter.finagle.http.codec.ResponseConformanceFilter$.apply(ResponseConformanceFilter.scala:18)
at com.twitter.finagle.Filter$$anon$1.apply(Filter.scala:80)
at com.twitter.finagle.http.codec.HttpServerDispatcher.dispatch(HttpServerDispatcher.scala:44)
at com.twitter.finagle.http.codec.HttpServerDispatcher.dispatch(HttpServerDispatcher.scala:20)
at com.twitter.finagle.http.exp.GenStreamingSerialServerDispatcher.$anonfun$dispatchAndHandleFn$2(GenStreamingSerialServerDispatcher.scala:79)
at com.twitter.util.Local.let(Local.scala:144)
at com.twitter.finagle.context.LocalContext.letLocal(LocalContext.scala:53)
at com.twitter.finagle.context.LocalContext.let(LocalContext.scala:24)
at com.twitter.finagle.http.exp.GenStreamingSerialServerDispatcher.$anonfun$dispatchAndHandleFn$1(GenStreamingSerialServerDispatcher.scala:78)
at com.twitter.util.Future.$anonfun$flatMap$1(Future.scala:1741)
at com.twitter.util.Promise$Transformer.liftedTree1$1(Promise.scala:331)
at com.twitter.util.Promise$Transformer.k(Promise.scala:331)
at com.twitter.util.Promise$Transformer.apply(Promise.scala:342)
at com.twitter.util.Promise$Transformer.apply(Promise.scala:323)
at com.twitter.util.Promise$WaitQueue.com$twitter$util$Promise$WaitQueue$$runDepth(Promise.scala:136)
at com.twitter.util.Promise$WaitQueue$$anon$6.run(Promise.scala:109)
at com.twitter.concurrent.LocalScheduler$Activation.run(Scheduler.scala:198)
at com.twitter.concurrent.LocalScheduler$Activation.submit(Scheduler.scala:157)
at com.twitter.concurrent.LocalScheduler.submit(Scheduler.scala:274)
at com.twitter.concurrent.Scheduler$.submit(Scheduler.scala:109)
at com.twitter.util.Promise$WaitQueue.runDepthInScheduler(Promise.scala:109)
at com.twitter.util.Promise$WaitQueue.runDepthInScheduler$(Promise.scala:108)
at com.twitter.util.Promise$Transformer.runDepthInScheduler(Promise.scala:323)
at com.twitter.util.Promise$WaitQueue.runInScheduler(Promise.scala:96)
at com.twitter.util.Promise$WaitQueue.runInScheduler$(Promise.scala:94)
at com.twitter.util.Promise$Transformer.runInScheduler(Promise.scala:323)
at com.twitter.util.Promise.updateIfEmpty(Promise.scala:909)
at com.twitter.util.Promise.update(Promise.scala:881)
at com.twitter.util.Promise.setValue(Promise.scala:857)
at com.twitter.concurrent.AsyncQueue.offer(AsyncQueue.scala:122)
at com.twitter.finagle.netty4.transport.ChannelTransport$$anon$1.channelRead(ChannelTransport.scala:183)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:86)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:86)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:86)
at com.twitter.finagle.netty4.channel.ChannelRequestStatsHandler.channelRead(ChannelRequestStatsHandler.scala:41)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
at com.twitter.finagle.netty4.http.handler.UnpoolHttpHandler$.channelRead(UnpoolHttpHandler.scala:32)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
at com.twitter.finagle.netty4.http.handler.BadRequestHandler$.channelRead0(BadRequestHandler.scala:23)
at com.twitter.finagle.netty4.http.handler.BadRequestHandler$.channelRead0(BadRequestHandler.scala:20)
at io.netty.channel.SimpleChannelInboundHandler.channelRead(SimpleChannelInboundHandler.java:105)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102)
at io.netty.handler.codec.MessageToMessageCodec.channelRead(MessageToMessageCodec.java:111)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:438)
at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:310)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:284)
at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:253)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
at io.netty.channel.ChannelInboundHandlerAdapter.channelRead(ChannelInboundHandlerAdapter.java:86)
at com.twitter.finagle.netty4.channel.ChannelStatsHandler.channelRead(ChannelStatsHandler.scala:108)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1359)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:935)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:134)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:645)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:580)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:497)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:459)
at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at com.twitter.finagle.util.BlockingTimeTrackingThreadFactory$$anon$1.run(BlockingTimeTrackingThreadFactory.scala:23)
at java.lang.Thread.run(Thread.java:745)