在UntypedActor Play 2.5中注入变量null

时间:2016-03-23 13:34:55

标签: java playframework dependency-injection akka actor

在这一刻,我处理一个棘手的问题。对于我的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;
     }
}

我在这里做错了什么?

2 个答案:

答案 0 :(得分:4)

现在我在互联网上长时间搜索后使用了以下代码

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

我不确定这是否是一个干净的解决方案你们有什么想法?

答案 1 :(得分:1)

播放2.5:创建以下课程:

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);
   }
}

然后在创建actor时,将GenericDependencyInjector与服务接口一起传递:

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

现在,您应该可以轻松地将您的服务注入演员。