如何在Play中实现对象的隐式写入

时间:2013-11-18 20:38:50

标签: scala slick playframework-2.2

我有一个模特

package models

import scala.slick.driver.SQLServerDriver.simple._
import play.api.libs.json._
import play.api.db.DB
import play.api.Play.current
import Database.threadLocalSession

case class College(collegeCode: String, collegeName: String)

object College {

  lazy val database = Database.forDataSource(DB.getDataSource())

  val CollegeTable = new Table[College]("College"){
    def collegeCode = column[String]("CollegeCode", O.PrimaryKey)
    def collegeName = column[String]("CollegeName")
    def * = collegeCode ~ collegeName <> (College.apply _, College.unapply _)
    implicit val CollegeReads = Json.reads[College]
    implicit val CollegeWrites = Json.writes[College]
  }

  def getAll: Seq[College] = {
    database withSession {
      val q = Query(CollegeTable)
      q.list
    }
  }

在我的控制器中,我试图将数据呈现为JSON。

Ok(Json.toJson(College.getAll))

查看页面时收到此错误:

No Json deserializer found for type Seq[models.College]. Try to implement an implicit Writes or Format for this type.

我认为在模型中定义隐式读/写可以解决这个问题。直到我做这样的事情:

Ok(Json.toJson(College.getAll.map { c=>
      (c.collegeCode, c.collegeName)
    } toMap)) 
实际呈现JSON之前在控制器中的

。我在隐式读/写实现中做错了什么?

1 个答案:

答案 0 :(得分:4)

问题是控制器无法看到隐含。它们隐藏在块内,用于定义CollegeTable

您是否有任何特殊原因需要此位置的隐含?如果没有,那么你可以把暗示放在你的控制器中。

如果您希望模型旁边有含义,请将含义移到一个级别并将其导入控制器。

object College {
  implicit val CollegeReads = Json.reads[College]
  implicit val CollegeWrites = Json.writes[College]
}

class Controller extends Controller {
  import College.CollegeReads
  import College.CollegeWrites

  ...
}