Scala Play 示例应用 Json 序列化程序错误

Scala Play Sample App Json Serializer errors

我正在尝试使用 Play 框架的 Scala 并拥有 10 多年的 Java/Spring 经验

下面是我正在尝试的源代码

路线文件

GET    /stock                      controllers.HomeController.saveStock

示例模型对象

import play.api.libs.json._

case class Stock(symbol: String = "", price: Double = 0d)

object Stock  {
  implicit def stockReads = Json.reads[Stock]
  implicit def stockWrites = Json.writes[Stock]
  implicit def stockFormat = Json.format[Stock]
}

示例控制器

import models.Stock
import javax.inject._
import play.api.mvc._
import play.api.libs.json._

@Singleton
class HomeController @Inject()(cc: ControllerComponents) extends AbstractController(cc: ControllerComponents) {
  def index() = Action { implicit request: Request[AnyContent] =>
    Ok(views.html.index())
  }
    def saveStock = Action{ implicit request: Request[AnyContent] =>
    var stocks = List(Stock())
    println(stocks)
    Ok(Json.toJson(Stock)).as("application/json")
    //Ok
  }
}

build.sbt

scalaVersion := "2.13.6"

libraryDependencies += guice
libraryDependencies += "org.scalatestplus.play" %% "scalatestplus-play" % "5.0.0" % Test
libraryDependencies += "com.typesafe.play" %% "play-server" % "2.8.8"
libraryDependencies += "com.typesafe.play" %% "play-slick" % "5.0.0"
libraryDependencies += "com.github.tminglei" %% "slick-pg" % "0.19.7"
libraryDependencies += "ai.x" %% "play-json-extensions" % "0.42.0"

错误 - http://localhost:9000/ 未找到类型 models.Stock.type 的 Json 序列化程序。尝试为此类型实现隐式写入或格式。

在错误消息“No Json serializer found for type models.Stock.type 中,需要注意的一件重要事情是 .type 后缀.

指的是object Stock,不是case class。那就是错误说“我不知道如何序列化 object Stock”。

这是因为您写的是 Json.toJson(Stock) 而不是 Json.toJson(Stock()) 或者您的意思是 Json.toJson(stocks).

Stock 指的是 objectStock() 是实例化 case class.


还有:

  • 如果在结果中使用 JsObject,则无需指定 as(...)
  • 你不需要 Reads 也不需要 Writes 如果你提供 Format (后者提供 2 个前者)
  • 使用val而不是var(不变性是Scala的强项)