I have been having this issue for some time where play will face an "cannot cast integer to long" exception.
play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[ClassCastException: Cannot cast java.lang.Integer to java.lang.Long]]
This happens at the line with "msgService.processMsg" call in the below code fragment:
def msgHandler(params: String) = auth.SecuredAction.async { implicit request =>
usersService.findUserByEmail(request.identity.email) flatMap {
case Some(ue) =>
val p = Json.parse(params.toLowerCase())
val op = (p \ "op").get(0).as[JsString].value
val prodId = (p \ "prodid").get(0).as[JsString].value
op match {
case "get-inventory" =>
msgService.processMsg(prodId.toLong, ue) flatMap { case res =>
Future.successful(Redirect(controllers.www.routes.Dashboard.dashboard))
}
case _ =>
Future.successful(Redirect(controllers.www.routes.Dashboard.dashboard))
}
case None =>
Future.successful(Redirect(controllers.www.routes.Dashboard.dashboard))
}
}
...
def amend(inventory: Inventory): Future[Long] = {
db.run(inventorys.withFilter(_.id === inventory.id).update(inventory)).mapTo[Long]
}
def processMsg(prodId: Long, user: UserEntry): Future[Long] = {
findInventoryByProdIdAndUserId(prodId, user.id) flatMap {
case Some(inventory) =>
var updInventory = inventory.copy(status = InventoryStatus.UPDATED)
Logger.debug(s"Updating inventory: ${updInventory}")
amend(updInventory)
case None =>
throw new Exception("No inventory entry found!!")
}
}
If I remove the flatMap and keep it like:
msgService.processMsg(prodId.toLong, ue)
then I don't see the error.
Also, if I return Future[Int] instead of Future[Inventory] I don't see the error.
I have used this pattern in few other places in the code but so far haven't been able to isolate what causes this problem. How do I get rid off this error?
Full trace of error:
! @7416eon6i - Internal server error, for (GET) [/processInviteResponse/%7B%22domain%22:%5B%22invites%22%5D,%22jobId%22:%5B%221%22%5D,%22op%22:%5B%22cand-accept%22%5D%7D] ->
play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[ClassCastException: Cannot cast java.lang.Integer to java.lang.Long]]
at play.api.http.HttpErrorHandlerExceptions$.throwableToUsefulException(HttpErrorHandler.scala:280)
at play.api.http.DefaultHttpErrorHandler.onServerError(HttpErrorHandler.scala:206)
at play.core.server.netty.PlayRequestHandler$$anonfun$2$$anonfun$apply$1.applyOrElse(PlayRequestHandler.scala:100)
at play.core.server.netty.PlayRequestHandler$$anonfun$2$$anonfun$apply$1.applyOrElse(PlayRequestHandler.scala:99)
at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:344)
at scala.concurrent.Future$$anonfun$recoverWith$1.apply(Future.scala:343)
at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32)
at play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:70)
at scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:40)
at scala.concurrent.impl.Promise$DefaultPromise.tryComplete(Promise.scala:248)
Caused by: java.lang.ClassCastException: Cannot cast java.lang.Integer to java.lang.Long
at java.lang.Class.cast(Class.java:3369)
at scala.concurrent.Future$$anonfun$mapTo$1.apply(Future.scala:405)
at scala.util.Success$$anonfun$map$1.apply(Try.scala:237)
at scala.util.Try$.apply(Try.scala:192)
at scala.util.Success.map(Try.scala:237)
at scala.concurrent.Future$$anonfun$map$1.apply(Future.scala:235)
at scala.concurrent.Future$$anonfun$map$1.apply(Future.scala:235)
at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32)
at scala.concurrent.BatchingExecutor$Batch$$anonfun$run$1.processBatch$1(BatchingExecutor.scala:63)
at scala.concurrent.BatchingExecutor$Batch$$anonfun$run$1.apply$mcV$sp(BatchingExecutor.scala:78)
2017-05-08 21:27:37,452 [trace] p.c.s.n.PlayRequestHandler - channelReadComplete: ctx = io.netty.channel.DefaultChannelHandlerContext@476e0189
2017-05-08 21:27:37,452 [trace] p.c.s.n.PlayRequestHandler - channelReadComplete: ctx = io.netty.channel.DefaultChannelHandlerContext@1141e6d7
2017-05-08 21:27:37,452 [trace] p.c.s.n.PlayRequestHandler - channelReadComplete: ctx = io.netty.channel.DefaultChannelHandlerContext@69368153
2017-05-08 21:27:37,452 [trace] p.c.s.n.PlayRequestHandler - channelReadComplete: ctx = io.netty.channel.DefaultChannelHandlerContext@27b15ff
2017-05-08 21:27:37,452 [trace] p.c.s.n.PlayRequestHandler - channelReadComplete: ctx = io.netty.channel.DefaultChannelHandlerContext@6a1fb0f1
2017-05-08 21:27:37,453 [trace] p.c.s.n.PlayRequestHandler - channelReadComplete: ctx = io.netty.channel.DefaultChannelHandlerContext@3884d6d5
Issue is resolved once I changed the amend function to
def amend(inventory: Inventory): Future[Int] = {
db.run(inventorys.withFilter(_.id ===
inventory.id).update(inventory)).mapTo[Int]
}
or even better
def amend(inventory: Inventory) = {
db.run(inventorys.withFilter(_.id ===
inventory.id).update(inventory))
}
Believe the returned Int is a number of rows updated though don't have reference to that.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.