我正在使用Playframework 2.5并试图制定一种方法,使所有Json请求/响应控制器方法调用,以避免在每个控制器方法内编写implicit val foo = Json.writes[Bar] or reads[Bar]
以及处理基本验证并返回错误代码。如何通过scala中的参数化类型获取隐式val/def?
BaseController将由每个控制器被继承
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")))
}
}
}
控制器
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)
}
)
}
代码以上无法编译因为handleJson
的implicit val convertReq = Json.reads[T]
和implicit val convertRes = Json.writes[U]
说
否的Json解析器找到的类型T.尝试实现一个implic它 这种类型的读取或格式。
我已经尝试制作案例类的同伴对象,并将其隐含在其中,尽管这并没有解决任何问题。
我的问题是,我如何使用参数化类型的隐式值?
在此先感谢。
谢谢,这正是我一直在寻找 – suish