Scala genericics'i kullanma Çalma uygulamamdaki bazı genel işlevleri soyutlamaya çalışıyorum. İşlevler, bir REST JSON hizmetinden serileştirilmiş nesnelerle Seq
s döndürür.Scala işlev türüne genel bakış
def getPeople(cityName: String): Future[Seq[People]] = {
getByEndpoint[People](s"http://localhost/person/$cityName")
}
def getPeople(): Future[Seq[Dog]] = {
getByEndpoint[Dog]("http://localhost/doge")
}
Getirme ve serileştirme mantığı, jenerikler kullanılarak tek bir işlevde toplanır. Sorun
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"))
}
}
}
ben "No Json deserializer found for type Seq[T]. Try to implement an implicit Reads or Format for this type.
" alıyorum olduğunu. Eminim T
'u Seq[T]
(en azından C#/Java hatıralarıma göre) kullanmıyorum, ancak Scala'da nasıl uygun bir şekilde yapılacağına dair bir ipucu bulamıyorum. Her şey jenerik kullanmadan beklendiği gibi çalışır.
'def getByEndpoint [T]' ifadesini 'def getByEndpoint [T: Formatı]' olarak değiştirmeyi deneyin. Bu sizin için işe yararsa, nedenini açıklayan bir cevap yazmaktan mutluluk duyarım. –
Yapıyor! Tahminimce, modellerde belirlediğim Json.format ile bir ilgisi var. Bir cevap yazabilir misiniz, böylece cevap olarak işaretleyebilir miyim? – giannoug