【问题标题】:Play framework 2.6 java websockets akka dependency injectionPlay framework 2.6 java websockets akka依赖注入
【发布时间】:2018-01-31 04:11:45
【问题描述】:

我在 play framework 2.6 中使用 java websockets 并且很难弄清楚 Guice DI。下面我正在注入 DbService(执行一些数据库操作),但我将 DbService 设为 null 并在行中抛出 NPE

User user = dbService.findByName(inEvent.getUsername());

dbService 为空。我不确定它为什么不注入 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)));

        });
    }

}

【问题讨论】:

    标签: java playframework playframework-2.0 akka actor


    【解决方案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 实例。 p>

    【讨论】:

    • 这只是一个例子,我还有其他服务要注入。有没有办法不将它传递给构造函数并直接注入actor。难道我们不能做任何 guice 魔法来直接将其注入演员中
    • 必须用guice来做吗?我做不到,也许有人做到了.... 使用当前代码,存在依赖注入。每次与 WebSocket 建立新连接时,都会使用给定的信息创建一个 Actor 实例。
    • 我必须使用 guice 进行依赖注入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    相关资源
    最近更新 更多