簡體   English   中英

Scala / Play ClassCastException:無法將java.lang.Integer轉換為java.lang.Long]

[英]Scala/Play ClassCastException: Cannot cast java.lang.Integer to java.lang.Long]

我遇到這個問題已有一段時間了,在這個過程中游戲將面臨“無法將整數轉換為長整數”的異常。

play.api.http.HttpErrorHandlerExceptions$$anon$1: Execution exception[[ClassCastException: Cannot cast java.lang.Integer to java.lang.Long]]

在下面的代碼片段中,使用“ msgService.processMsg”調用的行中發生了這種情況:

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!!")
  }
}

如果我刪除flatMap並保持如下所示:

msgService.processMsg(prodId.toLong, ue)

然后我看不到錯誤。

另外,如果我返回Future [Int]而不是Future [Inventory],則看不到錯誤。

我已經在代碼中的其他幾個地方使用了這種模式,但是到目前為止,還沒有找到導致此問題的原因。 如何擺脫這個錯誤?

完整的錯誤跟蹤:

! @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

將修訂功能更改為后,問題就解決了

def amend(inventory: Inventory): Future[Int] = {
  db.run(inventorys.withFilter(_.id === 
      inventory.id).update(inventory)).mapTo[Int]
} 

甚至更好

def amend(inventory: Inventory) = {
  db.run(inventorys.withFilter(_.id === 
      inventory.id).update(inventory))
} 

相信返回的Int是許多未更新的行,盡管沒有對此進行引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM