Я немного новичок в Scala, и я пытаюсь написать общий клиент для RESTful api, который я бы хотел использовать. Я могу предоставить конкретные Reads[T]
и Writes[T]
для конкретных классов случаев, для которых я хотел бы создать экземпляр моего клиента, однако компилятор рассчитывает найти Reads[T]
и Writes[T]
для любого типа, а не только для типов, которые я использую. Часть кода для иллюстрации (я опустил несоответствующие разделы):Общий клиент REST в Scala
Мой общий клиент:
class RestModule[T](resource: String, config: Config) ... with JsonSupport{
...
def create(item: T): Future[T] = {
val appId = config.apiId
val path = f"/$apiVersion%s/applications/$appId%s/$resource"
Future {
val itemJson = Json.toJson(item)
itemJson.toString.getBytes
} flatMap {
post(path, _)
} flatMap { response =>
val status = response.status
val contentType = response.entity.contentType
status match {
case Created => contentType match {
case ContentTypes.`application/json` => {
Unmarshal(response.entity).to[T]
}
case _ => Future.failed(new IOException(f"Wrong Content Type: $contentType"))
}
case _ => Future.failed(new IOException(f"HTTP Error: $status"))
}
}
...
}
JsonSupprt Черта:
trait JsonSupport {
implicit val accountFormat = Json.format[Account]
}
Я только когда-либо инстанцировании, как RestModule[Account]("accounts",config)
, но я получаю погрешность
Error:(36, 32) No Json serializer found for type T. Try to implement an implicit Writes or Format for this type.
val itemJson = Json.toJson(item)
^
Почему компилятор считает, что для типа T нужны буквы W, если T может только быть типа Account? Есть ли способ обойти это?
Спасибо! То, что вы говорите, работает, но есть ли способ избежать изменения интерфейса или заставить вызывающего быть ответственным за предоставление неявных '' 'Reads''' и' '' Writes'''?Это то, что я собирался сделать, поставив их в черту, в идеале я хотел бы сделать их доступными неявно где-то в классе, без звонящих, которые должны беспокоиться о том, чтобы поместить их в область видимости. – Rag
Конечно. Вы можете добавить параметр 'implicit', но добавьте свои' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '. Таким образом, когда кто-то использует 'create', scala сначала рассмотрит ваши предопределенные' Reads' и 'Writes'. – yw3410
Отредактировал фрагмент, чтобы показать, что я имею в виду. – yw3410