2017-05-09 3 views
0

umgewandelt werden Ich habe dieses Problem seit einiger Zeit, bei denen das Spiel eine "Kann nicht Integer zu lang" Ausnahme aussetzen.Scala/Play ClassCastException: java.lang.Integer kann nicht in java.lang.Long]

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

Das an der Linie geschieht mit "msgService.processMsg" Aufruf im folgenden Codefragment:

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

Wenn ich die flatMap entfernen und halten Sie es mögen:

msgService.processMsg(prodId.toLong, ue) 

dann Ich sehe den Fehler nicht.

Wenn ich Future [Int] anstelle von Future [Inventory] zurückgebe, sehe ich den Fehler nicht.

Ich habe dieses Muster an einigen anderen Stellen im Code verwendet, aber bisher konnte ich nicht isolieren, was dieses Problem verursacht. Wie kann ich diesen Fehler beheben?

Voll Spur Fehler:

! @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 = [email protected] 
2017-05-08 21:27:37,452 [trace] p.c.s.n.PlayRequestHandler - channelReadComplete: ctx = [email protected] 
2017-05-08 21:27:37,452 [trace] p.c.s.n.PlayRequestHandler - channelReadComplete: ctx = [email protected] 
2017-05-08 21:27:37,452 [trace] p.c.s.n.PlayRequestHandler - channelReadComplete: ctx = [email protected] 
2017-05-08 21:27:37,452 [trace] p.c.s.n.PlayRequestHandler - channelReadComplete: ctx = [email protected] 
2017-05-08 21:27:37,453 [trace] p.c.s.n.PlayRequestHandler - channelReadComplete: ctx = [email protected] 
+0

Was ist der Typ des Ergebnisses von processMsg, können Sie Code für processMsg bereitstellen? –

+0

@RaKa aktualisiert - danke – srvy

Antwort

0

Problem behoben ist, wenn ich die Funktion

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

oder noch besser

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

das zurück Int glaubt

Änderung geändert ist eine Zahl von Zeilen, die aktualisiert wurden, haben jedoch keinen Bezug darauf.

Verwandte Themen