Re: [scalatra-user] Issue in extracting case class from JSON POST

807 views
Skip to first unread message

Ivan Porto Carrero

unread,
Apr 11, 2013, 6:48:57 AM4/11/13
to scalat...@googlegroups.com


It's sending an array, try with parsedBody.extract[List[Person]]

RAW body: [{"id":5,"name":"Bob Loblaw"}]

-- 
Ivan Porto Carrero

On Thursday 11 April 2013 at 11:26, Nick Pentreath wrote:

Hi,

I'm trying to play around with basic routes and JSON input/output. I followed the instructions for getting an initial project started using g8 scalatra/scalatra-sbt.

Then I followed the instructions for Handling JSON with the relevant dependencies etc. The GET stuff works fine, but when I try to do:

  case class Person(id: Int, name: String)
  post("/create") {
    parsedBody.extract[Person]
  }

I get the error below. By the way, I am passing in the request via Chrome's REST console:

POST
RAW body: [{"id":5,"name":"Bob Loblaw"}]
Content-Type: application/json

Any assistance appreciated!

unknown error

org.json4s.package$MappingException: unknown error

at org.json4s.Extraction$.extract(Extraction.scala:46)
at org.json4s.ExtractableJsonAstNode.extract(ExtractableJsonAstNode.scala:21)
at com.usercloud.graphserver.GraphServlet$$anonfun$2.apply(GraphServlet.scala:32)
at com.usercloud.graphserver.GraphServlet$$anonfun$2.apply(GraphServlet.scala:32)
at org.scalatra.ScalatraBase$class.org$scalatra$ScalatraBase$$liftAction(ScalatraBase.scala:250)
at org.scalatra.ScalatraBase$$anonfun$invoke$1.apply(ScalatraBase.scala:245)
at org.scalatra.ScalatraBase$$anonfun$invoke$1.apply(ScalatraBase.scala:245)
at org.scalatra.ApiFormats$class.withRouteMultiParams(ApiFormats.scala:175)
at com.usercloud.graphserver.GraphServlet.withRouteMultiParams(GraphServlet.scala:11)
at org.scalatra.ScalatraBase$class.invoke(ScalatraBase.scala:244)
at com.usercloud.graphserver.GraphServlet.org$scalatra$json$JsonSupport$$super$invoke(GraphServlet.scala:11)
at org.scalatra.json.JsonSupport$$anonfun$invoke$1.apply(JsonSupport.scala:65)
at org.scalatra.json.JsonSupport$$anonfun$invoke$1.apply(JsonSupport.scala:57)
at org.scalatra.ApiFormats$class.withRouteMultiParams(ApiFormats.scala:175)
at com.usercloud.graphserver.GraphServlet.withRouteMultiParams(GraphServlet.scala:11)
at org.scalatra.json.JsonSupport$class.invoke(JsonSupport.scala:57)
at com.usercloud.graphserver.GraphServlet.invoke(GraphServlet.scala:11)
at org.scalatra.ScalatraBase$$anonfun$runRoutes$1$$anonfun$apply$7.apply(ScalatraBase.scala:220)
at org.scalatra.ScalatraBase$$anonfun$runRoutes$1$$anonfun$apply$7.apply(ScalatraBase.scala:218)
at scala.Option.flatMap(Option.scala:170)
at org.scalatra.ScalatraBase$$anonfun$runRoutes$1.apply(ScalatraBase.scala:218)
at org.scalatra.ScalatraBase$$anonfun$runRoutes$1.apply(ScalatraBase.scala:217)
at scala.collection.immutable.Stream.flatMap(Stream.scala:442)
at org.scalatra.ScalatraBase$class.runRoutes(ScalatraBase.scala:217)
at org.scalatra.ScalatraServlet.runRoutes(ScalatraServlet.scala:49)
at org.scalatra.ScalatraBase$class.runActions$1(ScalatraBase.scala:163)
at org.scalatra.ScalatraBase$$anonfun$executeRoutes$1.apply$mcV$sp(ScalatraBase.scala:175)
at org.scalatra.ScalatraBase$$anonfun$executeRoutes$1.apply(ScalatraBase.scala:175)
at org.scalatra.ScalatraBase$$anonfun$executeRoutes$1.apply(ScalatraBase.scala:175)
at org.scalatra.ScalatraBase$class.org$scalatra$ScalatraBase$$cradleHalt(ScalatraBase.scala:190)
at org.scalatra.ScalatraBase$class.executeRoutes(ScalatraBase.scala:175)
at org.scalatra.ScalatraServlet.executeRoutes(ScalatraServlet.scala:49)
at org.scalatra.ScalatraBase$$anonfun$handle$1.apply$mcV$sp(ScalatraBase.scala:113)
at org.scalatra.ScalatraBase$$anonfun$handle$1.apply(ScalatraBase.scala:113)
at org.scalatra.ScalatraBase$$anonfun$handle$1.apply(ScalatraBase.scala:113)
at scala.util.DynamicVariable.withValue(DynamicVariable.scala:57)
at org.scalatra.DynamicScope$class.withResponse(DynamicScope.scala:80)
at org.scalatra.ScalatraServlet.withResponse(ScalatraServlet.scala:49)
at org.scalatra.DynamicScope$$anonfun$withRequestResponse$1.apply(DynamicScope.scala:60)
at scala.util.DynamicVariable.withValue(DynamicVariable.scala:57)
at org.scalatra.DynamicScope$class.withRequest(DynamicScope.scala:71)
at org.scalatra.ScalatraServlet.withRequest(ScalatraServlet.scala:49)
at org.scalatra.DynamicScope$class.withRequestResponse(DynamicScope.scala:59)
at org.scalatra.ScalatraServlet.withRequestResponse(ScalatraServlet.scala:49)
at org.scalatra.ScalatraBase$class.handle(ScalatraBase.scala:111)
at org.scalatra.ScalatraServlet.org$scalatra$servlet$ServletBase$$super$handle(ScalatraServlet.scala:49)
at org.scalatra.servlet.ServletBase$class.handle(ServletBase.scala:43)
at com.usercloud.graphserver.GraphServlet.org$scalatra$scalate$ScalateSupport$$super$handle(GraphServlet.scala:11)
at org.scalatra.scalate.ScalateSupport$class.handle(ScalateSupport.scala:122)
at com.usercloud.graphserver.GraphServlet.handle(GraphServlet.scala:11)
at org.scalatra.ScalatraServlet.service(ScalatraServlet.scala:54)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:669)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:455)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:560)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1072)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:382)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1006)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
at org.eclipse.jetty.server.Server.handle(Server.java:361)
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:485)
at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:937)
at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:998)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:856)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240)
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:628)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
at java.lang.Thread.run(Thread.java:722)

0

java.lang.IndexOutOfBoundsException: 0

at scala.collection.LinearSeqOptimized$class.apply(LinearSeqOptimized.scala:51)
at scala.collection.immutable.List.apply(List.scala:78)
at org.json4s.reflect.ScalaSigReader$.findArgTypeForField(ScalaSigReader.scala:116)
at org.json4s.reflect.ScalaSigReader$.readField(ScalaSigReader.scala:38)
at org.json4s.reflect.Reflector$ClassDescriptorBuilder$$anonfun$3.apply(Reflector.scala:65)
at org.json4s.reflect.Reflector$ClassDescriptorBuilder$$anonfun$3.apply(Reflector.scala:64)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:47)
at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
at scala.collection.AbstractTraversable.map(Traversable.scala:105)
at org.json4s.reflect.Reflector$ClassDescriptorBuilder.fields(Reflector.scala:64)
at org.json4s.reflect.Reflector$ClassDescriptorBuilder.fields(Reflector.scala:77)
at org.json4s.reflect.Reflector$ClassDescriptorBuilder.properties(Reflector.scala:81)
at org.json4s.reflect.Reflector$ClassDescriptorBuilder.result(Reflector.scala:157)
at org.json4s.reflect.Reflector$.createDescriptor(Reflector.scala:50)
at org.json4s.reflect.Reflector$$anonfun$describe$1.apply(Reflector.scala:44)
at org.json4s.reflect.Reflector$$anonfun$describe$1.apply(Reflector.scala:44)
at org.json4s.reflect.package$Memo.apply(package.scala:19)
at org.json4s.reflect.Reflector$.describe(Reflector.scala:44)
at org.json4s.Extraction$.extract(Extraction.scala:281)
at org.json4s.Extraction$ClassInstanceBuilder.org$json4s$Extraction$ClassInstanceBuilder$$buildCtorArg(Extraction.scala:382)
at org.json4s.Extraction$ClassInstanceBuilder$$anonfun$11.apply(Extraction.scala:396)
at org.json4s.Extraction$ClassInstanceBuilder$$anonfun$11.apply(Extraction.scala:396)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
at scala.collection.TraversableLike$$anonfun$map$1.apply(TraversableLike.scala:244)
at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:47)
at scala.collection.TraversableLike$class.map(TraversableLike.scala:244)
at scala.collection.AbstractTraversable.map(Traversable.scala:105)
at org.json4s.Extraction$ClassInstanceBuilder.org$json4s$Extraction$ClassInstanceBuilder$$instantiate(Extraction.scala:396)
at org.json4s.Extraction$ClassInstanceBuilder$$anonfun$result$6.apply(Extraction.scala:424)
at org.json4s.Extraction$ClassInstanceBuilder$$anonfun$result$6.apply(Extraction.scala:421)
at org.json4s.Extraction$.org$json4s$Extraction$$customOrElse(Extraction.scala:433)
at org.json4s.Extraction$ClassInstanceBuilder.result(Extraction.scala:421)
at org.json4s.Extraction$.extract(Extraction.scala:283)
at org.json4s.Extraction$.extract(Extraction.scala:42)
at org.json4s.ExtractableJsonAstNode.extract(ExtractableJsonAstNode.scala:21)
at com.usercloud.graphserver.GraphServlet$$anonfun$2.apply(GraphServlet.scala:32)
at com.usercloud.graphserver.GraphServlet$$anonfun$2.apply(GraphServlet.scala:32)
at org.scalatra.ScalatraBase$class.org$scalatra$ScalatraBase$$liftAction(ScalatraBase.scala:250)
at org.scalatra.ScalatraBase$$anonfun$invoke$1.apply(ScalatraBase.scala:245)
at org.scalatra.ScalatraBase$$anonfun$invoke$1.apply(ScalatraBase.scala:245)
at org.scalatra.ApiFormats$class.withRouteMultiParams(ApiFormats.scala:175)
at com.usercloud.graphserver.GraphServlet.withRouteMultiParams(GraphServlet.scala:11)
at org.scalatra.ScalatraBase$class.invoke(ScalatraBase.scala:244)
at com.usercloud.graphserver.GraphServlet.org$scalatra$json$JsonSupport$$super$invoke(GraphServlet.scala:11)
at org.scalatra.json.JsonSupport$$anonfun$invoke$1.apply(JsonSupport.scala:65)
at org.scalatra.json.JsonSupport$$anonfun$invoke$1.apply(JsonSupport.scala:57)
at org.scalatra.ApiFormats$class.withRouteMultiParams(ApiFormats.scala:175)
at com.usercloud.graphserver.GraphServlet.withRouteMultiParams(GraphServlet.scala:11)
at org.scalatra.json.JsonSupport$class.invoke(JsonSupport.scala:57)
at com.usercloud.graphserver.GraphServlet.invoke(GraphServlet.scala:11)
at org.scalatra.ScalatraBase$$anonfun$runRoutes$1$$anonfun$apply$7.apply(ScalatraBase.scala:220)
at org.scalatra.ScalatraBase$$anonfun$runRoutes$1$$anonfun$apply$7.apply(ScalatraBase.scala:218)
at scala.Option.flatMap(Option.scala:170)
at org.scalatra.ScalatraBase$$anonfun$runRoutes$1.apply(ScalatraBase.scala:218)
at org.scalatra.ScalatraBase$$anonfun$runRoutes$1.apply(ScalatraBase.scala:217)
at scala.collection.immutable.Stream.flatMap(Stream.scala:442)
at org.scalatra.ScalatraBase$class.runRoutes(ScalatraBase.scala:217)
at org.scalatra.ScalatraServlet.runRoutes(ScalatraServlet.scala:49)
at org.scalatra.ScalatraBase$class.runActions$1(ScalatraBase.scala:163)
at org.scalatra.ScalatraBase$$anonfun$executeRoutes$1.apply$mcV$sp(ScalatraBase.scala:175)
at org.scalatra.ScalatraBase$$anonfun$executeRoutes$1.apply(ScalatraBase.scala:175)
at org.scalatra.ScalatraBase$$anonfun$executeRoutes$1.apply(ScalatraBase.scala:175)
at org.scalatra.ScalatraBase$class.org$scalatra$ScalatraBase$$cradleHalt(ScalatraBase.scala:190)
at org.scalatra.ScalatraBase$class.executeRoutes(ScalatraBase.scala:175)
at org.scalatra.ScalatraServlet.executeRoutes(ScalatraServlet.scala:49)
at org.scalatra.ScalatraBase$$anonfun$handle$1.apply$mcV$sp(ScalatraBase.scala:113)
at org.scalatra.ScalatraBase$$anonfun$handle$1.apply(ScalatraBase.scala:113)
at org.scalatra.ScalatraBase$$anonfun$handle$1.apply(ScalatraBase.scala:113)
at scala.util.DynamicVariable.withValue(DynamicVariable.scala:57)
at org.scalatra.DynamicScope$class.withResponse(DynamicScope.scala:80)
at org.scalatra.ScalatraServlet.withResponse(ScalatraServlet.scala:49)
at org.scalatra.DynamicScope$$anonfun$withRequestResponse$1.apply(DynamicScope.scala:60)
at scala.util.DynamicVariable.withValue(DynamicVariable.scala:57)
at org.scalatra.DynamicScope$class.withRequest(DynamicScope.scala:71)
at org.scalatra.ScalatraServlet.withRequest(ScalatraServlet.scala:49)
at org.scalatra.DynamicScope$class.withRequestResponse(DynamicScope.scala:59)
at org.scalatra.ScalatraServlet.withRequestResponse(ScalatraServlet.scala:49)
at org.scalatra.ScalatraBase$class.handle(ScalatraBase.scala:111)
at org.scalatra.ScalatraServlet.org$scalatra$servlet$ServletBase$$super$handle(ScalatraServlet.scala:49)
at org.scalatra.servlet.ServletBase$class.handle(ServletBase.scala:43)
at com.usercloud.graphserver.GraphServlet.org$scalatra$scalate$ScalateSupport$$super$handle(GraphServlet.scala:11)
at org.scalatra.scalate.ScalateSupport$class.handle(ScalateSupport.scala:122)
at com.usercloud.graphserver.GraphServlet.handle(GraphServlet.scala:11)
at org.scalatra.ScalatraServlet.service(ScalatraServlet.scala:54)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:669)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:455)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)
at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:560)
at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1072)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:382)
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1006)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)
at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:255)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)
at org.eclipse.jetty.server.Server.handle(Server.java:361)
at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:485)
at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:937)
at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:998)
at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:856)
at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240)
at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:628)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
at java.lang.Thread.run(Thread.java:722)

--
You received this message because you are subscribed to the Google Groups "scalatra-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email to scalatra-use...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.
 
 

Nick Pentreath

unread,
Apr 11, 2013, 8:07:05 AM4/11/13
to scalat...@googlegroups.com
Right after I posed this I eventually realised I was doing something wrong when I compared line-by-line to the Flowers example code:

I had the User case class and object def for UserData within the servlet class def. Once I moved it out by itself it seemed to just work. It wasn't obvious to me why (I'm still fairly new to Scala - maybe it's something to do with how it's all wired together?) but all seems good now!

Thanks.

Oh and I now have Swagger working too - very sweet project guys, thanks a lot!

Tomer Gabel

unread,
Apr 11, 2013, 8:20:55 AM4/11/13
to scalat...@googlegroups.com
A class nested inside a non-static (i.e. not an object) parent class always references its parent, and cannot "live" without an instance of the parent object. In other words, the User class you defined actually has a hidden field referencing the Servlet class, which the json4s mapper doesn't know how to handle.

Always keep DTOs either as top-level classes (classes within a package) or at most as static classes (classes within objects).
Reply all
Reply to author
Forward
0 new messages