玩框架2.6 java websockets akka依赖注入

时间:2018-01-31 04:11:45

标签: java playframework playframework-2.0 akka actor

我在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)));

        });
    }

}

1 个答案:

答案 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实例。