Использование генераторов Scala Я пытаюсь отделить некоторые общие функции в приложении Play. Функции возвращают Seq
с объектами, десериализованными из службы REST JSON.Тип возврата функции Scala на основе общих
def getPeople(cityName: String): Future[Seq[People]] = {
getByEndpoint[People](s"http://localhost/person/$cityName")
}
def getPeople(): Future[Seq[Dog]] = {
getByEndpoint[Dog]("http://localhost/doge")
}
Логика выборки и десериализации упакована в единую функцию с использованием дженериков.
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"))
}
}
}
Проблема в том, что я получаю «No Json deserializer found for type Seq[T]. Try to implement an implicit Reads or Format for this type.
». Я уверен, что не использую T
в Seq[T]
(по крайней мере, по моим моделям C#/Java), но я не могу найти подсказки, как это сделать в Scala. Все работает так, как ожидалось, без использования дженериков.
Попробуйте изменить 'def getByEndpoint [T]' на 'def getByEndpoint [T: Format]'? Если это сработает для вас, я с удовольствием напишу ответ, объясняющий, почему. –
Он делает! Я предполагаю, что это имеет какое-то отношение к 'Json.format'у, который я установил на моделях. Можете ли вы отправить ответ, чтобы я мог отметить его как ответ? – giannoug