Mit Scala Generics Ich versuche, einige allgemeine Funktionen in meiner Play-Anwendung zu abstrahieren. Die Funktionen geben Seq
s mit Objekten zurück, die aus einem REST JSON-Dienst deserialisiert wurden.Scala Funktion Rückgabetyp basierend auf generischen
Die Abruf- und Deserialisierungslogik ist in eine einzige Funktion gepackt, die Generics verwendet.
private def getByEndpoint[T](endpoint: String): Future[Seq[T]] = {
ws.url(endpoint)
.get()
.map(rsp => rsp.json)
.flatMap { json =>
json.validate[Seq[T]] match {
case s: JsSuccess[Seq[T]] =>
Future.successful(s.get)
case e: JsError =>
Future.failed(new RuntimeException(s"Get by endpoint JSON match failed: $e"))
}
}
}
Problem ist, ich bekomme "No Json deserializer found for type Seq[T]. Try to implement an implicit Reads or Format for this type.
". Ich bin sicher, dass ich nicht T
richtig in Seq[T]
(nach meiner C#/Java-Erinnerungen mindestens) verwenden, aber ich kann keine Ahnung finden, wie man es in Scala richtig macht. Alles funktioniert wie erwartet, ohne Generika zu verwenden.
Versuchen Sie 'def getByEndpoint [T]' auf 'def getByEndpoint [T: Format]' zu ändern? Wenn das für Sie funktioniert, schreibe ich Ihnen gerne eine Antwort, in der Sie erklären warum. –
Es tut! Meine Vermutung ist, dass es etwas mit dem 'Json.format' zu tun hat, das ich an den Modellen eingestellt habe. Können Sie bitte eine Antwort posten, damit ich sie als Antwort markieren kann? – giannoug