我試圖實現basically the same thing that is discussed here,但在我的特定情況下,它不起作用。將Scala類型傳遞給函數
目前我有一個函數驗證來自服務器的JSON響應。問題是,它有硬編碼到方法的JSON類型:
def fakeRequest[A: Writes](target:() => Call, requestObject: A): Any = {
route(FakeRequest(target()).withJsonBody(Json.toJson(requestObject))) match {
// ... stuff happens
Json.parse(contentAsString(response)).validate[GPInviteResponse]
^
注意硬編碼GPInviteResponse類型。
所以,爲了使它成爲一個完全通用且可重用的方法,最好傳入正在驗證的類型。
我嘗試這樣做:
def fakeRequest[A: Writes, B](target:() => Call, requestObject: A, responseType: B): Any = {
route(FakeRequest(target()).withJsonBody(Json.toJson(requestObject))) match {
// ... stuff happens
Json.parse(contentAsString(response)).validate[B]
^
,幾乎工作,但我得到一個No Json deserializer found for type B.
有道理,所以我把它改爲:
def fakeRequest[A: Writes, B: Reads](target:() => Call, requestObject: A, responseType: B): Any = {
不過,現在我得到No Json deserializer found for type controllers.GPInviteResponse.type.
所以,問題是:是否可以傳遞這樣的類型(或者是否有其他魔法可以使其工作)?
有的類型定義的解串器......我重新讀了一半了十幾次,以確保沒有錯字:
case class GPInviteResponse(inviteSent: Boolean, URL: Option[String], error: Option[GPRequestError] = None) {
def this(error: GPRequestError) = this(false, None, Option(error))
}
object GPInviteResponse {
implicit val readsInviteResponse = Json.reads[GPInviteResponse]
implicit val writesInviteResponse = Json.writes[GPInviteResponse]
}
編輯
包括下面是一個簡化的測試案例,演示了這個問題。目前,這不會編譯(錯誤如下所示)。我想我明白爲什麼它不起作用(隱約),但我不知道解決方案。我的理論爲什麼它不起作用:雖然提供的類型GPInviteRequest
確實有隱式讀/寫方法,但Scala無法建立實例B
實際上是GPInviteRequest
的連接,因此它得出結論認爲B
沒有讀/寫。
case class GPInviteResponse(inviteSent: Boolean)
object GPInviteResponse {
implicit val readsInviteResponse = Json.reads[GPInviteResponse]
implicit val writesInviteResponse = Json.writes[GPInviteResponse]
}
class TestInviteServices extends PlaySpecification {
"try to validate a type" in {
tryToValidate(GPInviteRequest(true))
}
def tryToValidate[B: Reads, Writes](i: B) = {
val json = Json.toJson(i).toString
Json.parse(json).validate[B].isSuccess must beTrue
}
}
上述試驗得到:
[錯誤] /Users/zbeckman/Projects/Glimpulse/Server-2/project/glimpulse-server/test/application/TestInviteServices.scala:46 : 未找到B類型的Json序列化程序。嘗試實施此類型的隱式 寫入或格式。 [error] val json = Json.toJson(i).toString [error]^[error] /Users/zbeckman/Projects/Glimpulse/Server-2/project/glimpulse-server/test/application/TestInviteServices.scala: 133: 找不到類型controllers.GPInviteResponse.type的Json解串器。 嘗試實現此類型的隱式讀取或格式。 [error] fakeRequest(controllers.routes.GPInviteService。邀請我, GPInviteResponse)匹配{[錯誤]^
你能給出一個編譯和展示問題的簡單例子嗎? –