在 UntypedActor Play 2.5 中注入的变量 null java

injected variables null in UntypedActor Play 2.5 java

此刻我正在处理一个棘手的问题。对于我的 API,我希望使用 Play 和 Akka actor。我遇到的问题是我尝试注入 Actor 的每个对象都为空。一种解决方案是将此对象注入控制器,然后将其传递给我的演员,但这不是我想要做的。我只希望我的对象在我需要它的地方。

package actors;

import actors.Messages.GetAanleverAfspraakById;
import akka.actor.UntypedActor;

import model.domain.AanleverAfspraakDO;
import play.db.jpa.JPAApi;

import javax.inject.Inject;
import javax.persistence.Query;
import java.util.Collection;

/**
 * Created by harms.h on 22-03-2016.
 */
public class AfspraakActor extends UntypedActor {
    @Inject
    private JPAApi api;

    @Override
    public void onReceive(Object message) throws Exception {
        if(message instanceof GetAanleverAfspraakById){
            final AanleverAfspraakDO aanleverAfspraakDO = this.getAanleverAfspraakDO(((GetAanleverAfspraakById) message).getId());
            getSender().tell(aanleverAfspraakDO, getSelf());
        }
        else{
            unhandled(message);
        }
    }

    private AanleverAfspraakDO getAanleverAfspraakDO(int id){
        final AanleverAfspraakDO aanleverAfspraakDO = api.withTransaction(() -> {
            final Query query = api.em().createNamedQuery("findbyid").setParameter("id", id);
            final Collection<AanleverAfspraakDO> resultSet = query.getResultList();
            final AanleverAfspraakDO result = resultSet.iterator().next();
            return result;
        });

        return aanleverAfspraakDO;
     }
}

我做错了什么?

现在我在网上搜索了很长时间后使用了下面的代码

this.api = Play.current().injector().instanceOf(JPAApi.class);

我不确定这是否是一个干净的解决方案,你们怎么看?

玩 2.5:创建以下 class:

import javax.inject.Inject;
import akka.actor.Actor;
import akka.actor.IndirectActorProducer;
import akka.actor.UntypedActor;
import play.api.Play;

public class GenericDependencyInjector implements IndirectActorProducer {

   final Class<? extends UntypedActor> actorClass;

   @Inject
   public GenericDependencyInjector(Class<? extends UntypedActor> actorClass) {
      this.actorClass = actorClass;
   }

   @Override
   public Class<? extends Actor> actorClass() {
      return actorClass;
   }

   @Override
   public Actor produce() {
      return Play.current().injector().instanceOf(actorClass);
   }
}

然后当您创建角色时,将 GenericDependencyInjector 与您的服务接口一起传递:

final Props props = Props.create(GenericDependencyInjector.class, JPAApi.class);
context().actorOf(props);

现在您应该可以轻松地将您的服务注入到 actor 中了。