Json Deserialization of type aliases

79 views
Skip to first unread message

sbaldwin

unread,
Jan 23, 2018, 4:50:21 PM1/23/18
to finatra-users
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?

Christopher Coco

unread,
Jan 24, 2018, 10:43:48 PM1/24/18
to sbaldwin, finatra-users
Hi there,

No, it’s not currently possible to swap out the JSON library in Finatra if you want to use the framework JSON features.

Can you include a test or code sample of the problem you’re experiencing? We may be able to provide more help with a bit more context.

Thanks,
-c

On Tue, Jan 23, 2018 at 1:50 PM, sbaldwin <sbald...@gmail.com> wrote:
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.

sbald...@gmail.com

unread,
Jan 25, 2018, 2:59:15 PM1/25/18
to finatra-users
Thanks for the help,

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?


sbaldwin

unread,
Jan 25, 2018, 3:13:16 PM1/25/18
to finatra-users
In case you need to know what the rest of the exception stack trace looks like here it is (this is from the finatra controller):

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)

Christopher Coco

unread,
Jan 31, 2018, 7:57:58 PM1/31/18
to sbaldwin, finatra-users
It may be better to create an issue in Github (you’ll be able to format the code better there) as I’m having some trouble following you here. Can you try that and we can take a closer look?

Thanks,
-c

Christopher Coco

unread,
Jan 31, 2018, 8:06:51 PM1/31/18
to sbaldwin, finatra-users
It looks like you’re hitting this issue: https://github.com/twitter/finatra/issues/305 which we’re most likely not going to address but would gladly accept a PR if you want to update the reflection code to be able to dereference Scala type aliases correctly. In short, to use the Finatra-specific features for now you need a real type (not an alias).

Thanks,
-c
Reply all
Reply to author
Forward
0 new messages