サービスをアクタに挿入する方法がわかりません。アクターにサービスを注入するとNullPointerExceptionが発生します
私はいくつかのアプローチを試してみましたが、これは一番合うと思います。
私は、パラメータとして次のアクターにwebsocketを提供することが大きな問題だと思います。 Injectをクラス・シグネチャにプルすると、シグネチャの競合が原因でコンパイルが実行されません。 サービスを注入するために暗黙のクラス宣言を追加しようとしましたが、これもうまくいきませんでした。
正しくするにはどうすればよいですか?
このコードを実行すると、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))
}
コントローラコードは:
class WeatherWSController @Inject() (implicit system: ActorSystem, materializer: Materializer) extends Controller {
def socket = WebSocket.accept[JsValue, JsValue] { request =>
ActorFlow.actorRef(out => WeatherWSActor.props(out));
}
}
サービスは、このモジュールコード
class Module extends AbstractModule {
override def configure(): Unit = {
bind(classOf[WeatherService]).to(classOf[WeatherServiceImpl]).asEagerSingleton()
}
}