我有一些简单的消息,它们隐含Json.reads
并Json.formats
在它们的伴随对象中定义。所有这些消息都扩展了MyBaseMessage
.
换句话说,对于任何T <: MyBaseMessage
,T
都是(反)可序列化的。
这些消息表示要在集群上执行的简单 CRUD 操作,因此在发送 JSON 的 CLI 和集群之间有一个 Play 服务器。因为操作简单,所以我应该可以Action
在 Play 端做一些非常通用的 s:当我在一个端点接收到 JSON 时,根据端点反序列化消息并将该消息转发到集群。
我的最终目标是做这样的事情:
// AddBooMessage extends MyBaseMessage
def addBoo = FooAction[AddBooMessage]
// AddMooMessage extends MyBaseMessage
def addMoo = FooAction[AddMooMessage]
// etc. ...
所以当请求发送到addBoo
消息对应的路由时,请求的JSON会被解析成AddBooMessage
消息并推送到集群中。重复恶心。
我写了以下内容:
private def FooAction[T <: MyBaseMessage] = Action {
implicit request =>
parseAndForward[T](request)
}
private def parseAndForward[T <: MyBaseMessage](request: Request[AnyContent]) = {
val parsedRequest = Json.parse(request.body.toString).as[T]
Logger.info(s"Got '$parsedRequest' request. Forwarding it to the Cluster.")
sendToCluster(parsedRequest)
}
但我发现以下错误:
没有为 type 找到 Json 反序列化器
T
。尝试为这种类型实现一个隐式Reads
或Format
。
但是,所有这些消息都是可序列化的,并且两者都有Reads
并Format
为它们定义。
我试图传递(implicit fjs: Reads[T])
给parseAndForward
希望隐式提供Reads
所需的(尽管它应该已经隐式提供),但它没有帮助。
我怎么解决这个问题?