簡體   English   中英

Scala和Play2:ClassCastException:無法將java.lang.Object強制轉換為play.api.libs.json.JsValue

[英]Scala and Play2: ClassCastException: java.lang.Object cannot be cast to play.api.libs.json.JsValue

這是我第二次碰到這個問題。 編輯:我發現這也是我第二次在堆棧上詢問,這是我遇到的第三或第四次。 另一個問題在這里: Scala中的Cast類異常:將Java.lang.Object轉換為Scala CaseClass

大量編輯...經過大量分析,我可以簡化問題。 看來這是我如何使用特征以及實現/覆蓋toJson方法的問題...我確定這很容易,但是我一直無法發現我在做錯什么。

我收到此類強制轉換異常,因此看不到任何問題。

我有這個:

package service

import play.api.libs.json.{JsObject, Json, JsValue}

/**
 * author: jason goodwin
 */
trait Jsonable{

  def toJson: JsValue = {null}
}

object Jsonable {
  def renderJsonableListToJson(entities: Iterable[Jsonable]): String = {

    val jsonList = Json.toJson(entities.map(x => x.toJson).toSeq)
    val result = JsObject("meta" -> JsObject(Seq()) :: "data" -> jsonList :: Nil)

    Json.stringify(result)
  }
}

這是與Java庫接口的:

trait GraphedArticle extends BaseFramedEntity with Jsonable {

  @Property("articleId")
  def setArticleId (userId: String)

  @Property("articleId")
  def getArticleId:String

  @Property("title")
  def setTitle (title: String)

  @Property("title")
  def getTitle:String

  @Property("preview")
  def setPreview (preview: String)

  @Property("preview")
  def getPreview: String

  @Property("imageUrl")
  def setImageUrl (imageUrl: String)

  @Property("imageUrl")
  def getImageUrl: String

  @Property("articleUrl")
  def setArticleUrl (imageUrl: String)

  @Property("articleUrl")
  def getArticleUrl: String

  override def toJson: JsValue = {
    val ret = JsObject(
      "articleId" -> Json.toJson(getArticleId)
        :: "graphId" -> Json.toJson(asVertex().getId.toString)
        :: "created_time" -> Json.toJson(123123123)
        :: "url" -> Json.toJson(getArticleUrl)
        :: "title" -> Json.toJson(getTitle)
        :: "preview" -> Json.toJson("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut euismod pellentesque facilisis. Morbi odio sem, dapibus eget cursus vel, sodales in diam. Nunc porttitor mauris vitae diam imperdiet nec bibendum magna eleifend. Mauris sapien lectus, sodales et tincidunt at, aliquam a leo. Nullam quis enim vitae ligula condimentum tempus. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aliquam ut facilisis quam. Aenean sed dapibus sapien. Nulla facilisi.")
        :: "image" -> Json.toJson(getImageUrl)
        :: "topics" -> JsArray(Seq(Json.toJson("Tiger Dog"), Json.toJson("Lemon Party")))
        :: "from_user" -> JsArray(
        JsObject(
          "username" -> Json.toJson("fudgeface")
            :: "full_name" -> Json.toJson("Mr. Fudge Face")
            :: "id" -> Json.toJson("#3:27")
            :: "profile_picture" -> Json.toJson("url here")
            :: Nil
        ) :: Nil)
        :: "shares" -> JsArray(
        JsObject(
          "count" -> Json.toJson("100")
            :: Nil
        ) :: Nil)
        :: Nil).asInstanceOf

    println(ret.toString, "here")
    ret

  }
}

如果我嘗試訪問Json,它將死亡。 其他方法有效。

println("\n\n"+getArticleList(defaultPage, defaultPageSize).head.toJson)

error] application - 

! @6dckhec3c - Internal server error, for request [GET /articles] ->

play.core.ActionInvoker$$anonfun$receive$1$$anon$1: Execution exception [[ClassCastException: java.lang.Object cannot be cast to play.api.libs.json.JsValue]]
    at play.core.ActionInvoker$$anonfun$receive$1.apply(Invoker.scala:134) [play_2.9.1.jar:2.0.4]
    at play.core.ActionInvoker$$anonfun$receive$1.apply(Invoker.scala:115) [play_2.9.1.jar:2.0.4]
    at akka.actor.Actor$class.apply(Actor.scala:318) [akka-actor.jar:2.0.2]
    at play.core.ActionInvoker.apply(Invoker.scala:113) [play_2.9.1.jar:2.0.4]
    at akka.actor.ActorCell.invoke(ActorCell.scala:626) [akka-actor.jar:2.0.2]
    at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:197) [akka-actor.jar:2.0.2]
Caused by: java.lang.ClassCastException: java.lang.Object cannot be cast to play.api.libs.json.JsValue
    at $Proxy53.toJson(Unknown Source) ~[na:na]
    at controllers.ArticleController$$anonfun$index$1.apply(ArticleController.scala:111) ~[classes/:2.0.4]
    at controllers.ArticleController$$anonfun$index$1.apply(ArticleController.scala:97) ~[classes/:2.0.4]
    at play.api.mvc.Action$$anon$1.apply(Action.scala:170) ~[play_2.9.1.jar:2.0.4]
    at play.core.ActionInvoker$$anonfun$receive$1$$anonfun$6.apply(Invoker.scala:126) ~[play_2.9.1.jar:2.0.4]
    at play.core.ActionInvoker$$anonfun$receive$1$$anonfun$6.apply(Invoker.scala:126) ~[play_2.9.1.jar:2.0.4]
[debug] application - [securesocial] calling deleteExpiredTokens()

知道為什么嗎? 在我看來還可以。

在默認框架中已經有一個與Jsonable相似的特征。 此特征稱為Writes toJson方法自動使用它。

它會像這樣工作:

import play.api.libs.json.Json.toJson 

object GraphedArticle {

  implicit object graphedArticleWrites extends Writes[GraphedArticle] {
    def writes(g: GraphedArticle) = 
      toJson(Map(
          "articleId" -> toJson(g.getArticleId),
          "graphId" -> toJson(asVertex().getId.toString)
          "created_time" -> toJson(123123123)))
    }
}

此方法看起來會有些不同:

import play.api.libs.json.Json.toJson

def renderListToJson[T](entities: Iterable[T])(implicit writes:Writes[T]): String = {

  val jsonList = Json.toJson(entities.map(Json.toJson).toSeq)
  val result = Json.toJson(Map(
      "meta" -> Json.toJson(Seq()), 
      "data" -> jsonList))

  Json.stringify(result)
}

暫無
暫無

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

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