Как правильно зарегистрировать универсальный тип в spray-json-support в akka-http Scala? - PullRequest
0 голосов
/ 05 ноября 2018

Итак, у меня есть этот класс:

case class Something[T](data: Option[T] = None)

И я регистрирую это как инструкция, указанная в https://github.com/spray/spray-json и в https://doc.akka.io/docs/akka-http/current/common/json-support.html. Как это:

import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport
import spray.json.DefaultJsonProtocol

trait InternalJsonFormat extends SprayJsonSupport with DefaultJsonProtocol {
    import spray.json._

    implicit def somethingFormat[A :JsonFormat] = jsonFormat1(Something.apply[A])
}

И, наконец, я использовал complete из директивы akka http. Как это:

import akka.http.scaladsl.server.Directives._

object ResponseIt extends InternalJsonFormat {
    def apply[T](rawData: T) = {
        val theResponse = Something(data = Some(rawData))
        complete(theResponse)
    }
}

А потом я получаю ошибку в complete(theResponse). Он сказал

Type mismatch, expected: ToResponseMarshallable, actual: Something[T]

=============================================== ============

Я пытаюсь отредактировать последний код для отладки, например:

object ResponseIt extends InternalJsonFormat {
    import spray.json._

    def apply[T](rawData: T) = {
        val theResponse = Something(data = Some(rawData))
        val trying = theResponse.toJson
        complete(theResponse)
    }
}

и получите новую ошибку в val trying = theResponse.toJson. как это:

No implicits found for parameter writer: JsonWriter[Something[T]] 

Итак, я действительно запутался, что не так в моем коде? Есть ли правильный способ использовать спрей json support в akka http?

Заранее спасибо

1 Ответ

0 голосов
/ 05 ноября 2018

Видите ли, здесь нет никаких доказательств существования JsonFormat для вашего T:

 def apply[T](rawData: T) = {
        // ^--- here
        val theResponse = Something(data = Some(rawData))
        val trying = theResponse.toJson
        complete(theResponse)
    }

Можно переписать этот метод, чтобы предоставить JsonFormat для универсального T:

def apply[T](rawData: T)(implicit formatter: JsonFormat[T]) 
...