Ich denke, ich kann eine generische Lösung für das bereitstellen, was Sie versuchen zu tun. Sie können durch die Schaffung einer Methode beginnen, die eine Route
kehrt wie folgt:
def service[T:ClassTag](actor:ActorRef, command:Any)
(implicit timeout:Timeout, _marshaller: ToResponseMarshaller[T]):Route = {
val fut = (actor ? command).mapTo[ServiceResponse]
onComplete(fut){
case util.Success(ir:InvalidRequest) =>
complete(StatusCodes.BadRequest, ir)
case util.Success(t:T) =>
complete(t)
case util.Failure(ex) =>
complete(StatusCodes.InternalServerError)
}
}
Diese Methode löst eine Anforderung an einen Schauspieler geliefert, über fragen und bekommt die Future
das Ergebnis darstellt. Es verwendet dann die onComplete
Direktive, um spezielle Behandlung auf den InvalidResponse
Fall anzuwenden. Hier ist wichtig, dass Sie einen impliziten ToResponseMarshaller[T]
im Geltungsbereich haben, da Sie dies für den Erfolgsfall benötigen.
Dann lassen Sie uns sagen, dass Sie die folgenden Klassen und Formatter definiert hatte:
trait ServiceResponse
case class Foo(id:Int) extends ServiceResponse
implicit val fooFormat = jsonFormat1(Foo)
case class InvalidRequest(error:String) extends ServiceResponse
implicit val invalidRequestFormat = jsonFormat1(InvalidRequest)
Sie könnten Ihre neue service
Methode in Ihrem Routingbaum wie folgt verwenden:
val routes:Route = {
path("api"/"foo"){
get{
service[Foo](fooActor, FooActor.DoFoo)
}
}
}
Das Problem mit Ihrem Beispiel ist, dass Sie nicht auf die Fertigstellung der Future
gewartet haben, bevor Sie die Antwort erstellt haben. Sie haben versucht, auf den zugrunde liegenden Typ des Future
zu passen, der durch Löschen zur Laufzeit eliminiert wird, also ist es keine gute Idee, auf diese Weise zu versuchen und zu vergleichen. Sie müssen stattdessen warten, bis es abgeschlossen ist und dann den Typ sehen, der hinter der Future
steht.
Verwenden Sie Akkas Spray JSON Unterstützung für Ihren Marshalling zu JSON? – cmbaxter
ja Ich habe die Frage aktualisiert – Randomize
Ich denke, es könnte einfacher sein nur versuchen, den http-Status zu ändern 408 – Randomize