Я пытаюсь создать общую черту для моих актеров, чтобы избежать кода copypasting, в основном, как это:неявного значения полиморфизм в Scala и спрейте
import akka.actor.Actor
import spray.json._
import scala.concurrent.Future
trait ActorResponsive[T] extends Actor {
import DefaultJsonProtocol._
import context.dispatcher
case class Response(success: Boolean,
single: Option[T] = None,
multiple: Option[Seq[T]] = None,
message: Option[String] = None)
implicit val responseFormat = jsonFormat4(Response)
def makeResponse(f: Future[Any]) =
f.map { /*...*/ }.recover { /*...*/ }
.map { case r => r.toJson.compactPrint }
}
Независимо от других кодов недостатков, я пытаюсь сделать responseFormat
решено полиморфно, например:
class PostgresItemActor extends ActorResponsive[Item] {
import com.blahblah.models.ItemJsonProtocol._
override def receive = makeResponse(someFuture)
}
...
class PostgresEventActor extends ActorResponsive[Event] {
import com.blahblah.models.EventJsonProtocol._
override def receive = makeResponse(someFuture)
}
Так JsonProtocol каждый раз responseFormat
называются будет решено в отношении импорта в классе, реализуя ActorResponsive
черты. На данный момент, я получаю ошибку компиляции:
Cannot find JsonWriter or JsonFormat type class for ActorResponsive.this.Response
Вероятно, я получаю некоторые концепции объектно-ориентированного программирования здесь не так, но это можно решить jsonFormat(Response)
для T
или достичь какой-то поведение, как это?
Спасибо, что мне удалось сделать это с помощью такой функции: определение функции makeResponse (е: Future [Любой]) (неявный автор: spray.json. JsonWriter [Response [T]], исполнитель: scala.concurrent.ExecutionContext) = ... ' – infm