【问题标题】:Cannot resolve Writes[T] at compile time in Play Json无法在 Play Json 的编译时解析 Writes[T]
【发布时间】:2015-05-22 15:09:32
【问题描述】:

我正在尝试制作一个通用 Writer 来让我使用 Play Json 获取 json 的字符串表示形式。到现在为止我得到的是

import com.twitter.finatra.http.Controller
import play.api.libs.json.{Json, Writes}

trait MyController extends Controller {
  def handle(request: AnyRef) =
    response
     .ok
     .json(createJsonResponse(manage(request)))
     .toFuture

   def manage[T : Writes](request: AnyRef): T

  // There should be an implicit Writes[T] in scope
   def createJsonResponse[T : Writes](data: T) = Json.stringify(Json.toJson[T](data))
}

我定义了case class TotalsForResponse(issuer: String, total: Int) 并且

  object JsonFormatters {
   implicit val totalsForResponseWrites = Json.format[TotalsForResponse]
  }

这应该在编译时为我提供范围内的隐式 Writes[T]。在我的一个控制器中,我有

def manage[T : Writes](request: AnyRef) = request match {

case TotalInvestorsForRequest(issuer) =>
  TotalsForResponse(issuer,
    TitleSectionDBHandler.totalInvestorsFor(issuer))
  .asInstanceOf[T]
}

在编译时导致diverging implicit expansion for type play.api.libs.json.Writes[Nothing] 。这是从this example 获取的,我无法让它工作。有什么想法吗?

【问题讨论】:

  • 运行时如何出现隐式解析错误?
  • 将其更正为“编译”谢谢!
  • 我在您发布的代码中没有看到实现泛型类型T 的任何地方(我的意思是一个具体类型作为泛型类型T 给出)。整个代码对我来说似乎有点奇怪,不确定你想要实现什么,但我会首先确保 Json.toJson[TotalsForResponse] 编译成功。
  • 嗨 Nader,Json.toJson(TotalsForResponse(issuer, total)) 确实在管理函数中编译成功,但不是在 MyController 范围内,尽管我在里面正确导入了 JsonFormatters,类型 T 将是定义 Writes[T] 的任何类型那边。
  • @TomasDuhourq 你搞定了吗?

标签: scala reflection play-json


【解决方案1】:

在您链接的示例中,您忘记添加 import JsonFormatters._ 以将 Format[T] 纳入范围。

【讨论】:

  • 导入了它们,在编译时仍然出现同样的错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-07
  • 1970-01-01
  • 1970-01-01
  • 2014-03-12
  • 1970-01-01
  • 2013-12-30
  • 1970-01-01
相关资源
最近更新 更多