Ich bin nicht in der Lage, herauszufinden, wie man einen Dienst in einen Actor injizieren.injizierenden Dienst in den Darsteller gibt NullPointerException
Ich habe mehrere Ansätze ausprobiert und denke, dass diese am besten passen sollte.
Ich denke, das Hauptproblem besteht darin, dass ich dem nachfolgenden Akteur den Websocket als Parameter zur Verfügung stelle. Wenn ich das Inject bis zur Klassensignatur-Kompilierung ausfühle, wird wegen eines Signaturkonflikts keine Kompilierung durchgeführt. Ich habe versucht, eine currying implizite Klassendeklaration hinzuzufügen, um den Dienst zu injizieren, aber das hat auch nicht geklappt.
Was soll ich tun, um es richtig zu machen?
Das Ausführen dieses Codes führt zu einer NullPointerException.
package actors
import akka.actor._
import com.google.inject.Inject
import play.api.libs.json._
import models._
import services.WeatherService
/**
* Created by jbc on 28.12.16.
*/
class WeatherWSActor (out: ActorRef) extends Actor {
@Inject() val weatherService: WeatherService = null
def handleMessage(msg: JsValue): JsValue = {
val req = msg.as[Request]
req match {
case Request("daily") => Json.toJson(weatherService.getFourDays())
case Request("next") => Json.toJson(weatherService.getNextHour())
}
}
override def receive: Receive = {
case msg: JsValue => out ! handleMessage(msg)
case _ => out ! "Bad Request"
}
@scala.throws[Exception](classOf[Exception])
override def postStop(): Unit = {
}
}
object WeatherWSActor {
def props(out: ActorRef) = Props(new WeatherWSActor(out))
}
Controller-Code:
class WeatherWSController @Inject() (implicit system: ActorSystem, materializer: Materializer) extends Controller {
def socket = WebSocket.accept[JsValue, JsValue] { request =>
ActorFlow.actorRef(out => WeatherWSActor.props(out));
}
}
Der Dienst wird mit diesem Modul-Code
class Module extends AbstractModule {
override def configure(): Unit = {
bind(classOf[WeatherService]).to(classOf[WeatherServiceImpl]).asEagerSingleton()
}
}