Je ne suis pas capable de comprendre comment injecter un service dans un acteur.injecter le service dans l'acteur donne NullPointerException
J'ai essayé plusieurs approches et je pense que celle-ci devrait être la meilleure.
Je pense que le problème majeur est que je fournis la socket Web à l'acteur suivant en tant que paramètre. Lorsque je tire l'Inject jusqu'à la compilation de la signature de classe ne fonctionne pas à cause du conflit de signature. J'ai essayé d'ajouter une déclaration de classe implicite pour injecter le service, mais cela n'a pas fonctionné non plus.
Que dois-je faire pour bien faire les choses?
L'exécution de ce code entraîne une exception 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))
}
Code du contrôleur:
class WeatherWSController @Inject() (implicit system: ActorSystem, materializer: Materializer) extends Controller {
def socket = WebSocket.accept[JsValue, JsValue] { request =>
ActorFlow.actorRef(out => WeatherWSActor.props(out));
}
}
Le service est mis en place avec ce code de module
class Module extends AbstractModule {
override def configure(): Unit = {
bind(classOf[WeatherService]).to(classOf[WeatherServiceImpl]).asEagerSingleton()
}
}