我正在使用 Playframework 2.5 并尝试创建一个所有 Json 请求/响应控制器方法调用的方法,以避免implicit val foo = Json.writes[Bar] or reads[Bar]
在每个控制器方法内部写入以及处理基本验证并返回错误代码。
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
'simplicit val convertReq = Json.reads[T]
和implicit val convertRes = Json.writes[U]
说
找不到类型 T 的 Json 反序列化器。尝试为此类型实现隐式读取或格式。
我已经尝试过制作案例类的伴生对象并将隐含的对象放入其中,尽管这并不能解决任何问题。
我的问题是,如何使用参数化类型的隐式值?
提前致谢。