我在play framework 2.6中使用java websockets并且很难搞清楚Guice DI。下面我注入DbService(执行一些数据库操作),但我得到DbService为null并在线上抛出NPE
User user = dbService.findByName(inEvent.getUsername());
dbService为null。我不确定它为什么不注入DbService。虽然这项工作当我不通过akka演员使用它时。我将DbService绑定到它的实现。
演员
public class TestActor extends AbstractActor {
@Inject
private DbService dbService;
private ActorRef out;
public static Props props(final ActorRef out) {
return Props.create(TestActor.class, out);
}
public TestActor(ActorRef out) {
this.out = out;
}
@Override
public Receive createReceive() {
return receiveBuilder()
.match(InEvent.class, inEvent -> {
System.out.println(inEvent.getUsername());
User user = dbService.findByName(inEvent.getUsername());
System.out.println(user.getFirstName());
out.tell("userName is ", self());
}
)
.build();
}
}
控制器
public class Application extends Controller {
public WebSocket TestWebSocket() {
return WebSocket.json(InEvent.class).acceptOrResult(request -> {
final Token token = verifyToken(request());
if (token == null) {
return CompletableFuture.completedFuture(F.Either.Left(forbidden()));
}
return CompletableFuture.completedFuture(
F.Either.Right(ActorFlow.actorRef(out -> TestActor.props(out), actorSystem, materializer)));
});
}
}
答案 0 :(得分:-1)
您的actor将根据Props.create()中使用的参数构建。
在你的例子中:
Props.create(Class<TestActor>, ActorRef);
将 TestActor.class 中的构造函数与一个 ActorRef 类型的参数匹配,并且该构造函数将使用您提供的参数进行调用。
您可以像这样更改构造函数签名和props方法:
...
public static Prop props(ActorRef out, DBServide db) {
return Props.create(TestActor.class, out, db);
}
...
public TestActor(ActorRef out, DBService db) {
this.out = out;
this.dbService = db;
}
...
这样,将使用构造函数 TestActor(ActorRef,DBService),当您调用静态方法 props 时,您将获得使用的DBService实例。