gpt4 book ai didi

json - 如何通过 Scala 中的参数化类型获取隐式 val/def?

转载 作者:行者123 更新时间:2023-12-01 08:27:18 25 4
gpt4 key购买 nike

我正在使用 Playframework 2.5 并尝试制作一个所有 Json 请求/响应 Controller 方法调用的方法,以避免在内部编写 implicit val foo = Json.writes[Bar] 或 reads[Bar]每个 Controller 方法以及处理基本验证并返回错误代码。

BaseController 将被每个 Controller 继承

class BaseController @Inject()(implicit exec: ExecutionContext) extends Controller {
def handleJson[T <: RequestModel,U <: ResponseModel](request: Request[JsValue])(cb: (T) => Future[U]):Future[Result] = {
implicit val convertReq = Json.reads[T]
implicit val convertRes = Json.writes[U]
val reqOpt = request.body.asOpt[T]
reqOpt match {
case Some(data) =>
cb(data).map{x => Ok(Json.toJson(x))}
case None =>
Future.successful(Ok(Json.obj("foo" -> "bar")))
}
}
}

Controller

  def send = Action.async(parse.json) { req =>
handleJson[RequestCaseClass,ResponseCaseClass](req)( (x) =>
injectedClass.foo(x.bar).map{ case (success: Boolean,mes: String) =>
if(success) SendRes(SomethingForSuccess)
else SendRes(SomethingForError)
}
)
}

上面的代码无法编译,因为handleJsonimplicit val convertReq = Json.reads[T]implicit val convertRes = Json.writes[ U]

No Json deserializer found for type T. Try to implement an implicit Reads or Format for this type.

我已经尝试制作 case 类的伴生对象并将隐式放入其中,尽管这并没有解决任何问题。

我的问题是,如何使用参数化类型的隐式值?

提前致谢。

最佳答案

我建议这样做

class Application @Inject()(implicit exec: ExecutionContext) extends Controller {
def handleJson[A : Reads, B : Writes](request: Request[JsValue])(cb: A => Future[B]): Future[Result] = {
val reqOpt = request.body.asOpt[A]
reqOpt match {
case Some(data) =>
cb(data).map { x => Ok(Json.toJson(x)) }
case None =>
Future.successful(Ok(Json.obj("foo" -> "bar")))
}
}

def index = Action.async(parse.json) { req =>
handleJson[MyReq, MyResp](req)(x => Future.successful(MyResp((x.i to x.i + 4).toList)))
}
}

您不必用任何特征来约束您的模型,只要隐式ReadsWrites 存在即可。

为确保这一点,最好在类的伴生对象中定义ReadsWrites。当您导入模型类时,您会将它们带到隐式范围。

object MyReq {
implicit val myReqReads: Reads[MyReq] = Json.reads[MyReq]
}
case class MyReq(i: Int)

object MyResp {
implicit val myRespWrites: Writes[MyResp] = Json.writes[MyResp]
}
case class MyResp(l: List[Int])

关于json - 如何通过 Scala 中的参数化类型获取隐式 val/def?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36351481/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com