在这一刻,我处理一个棘手的问题。对于我的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;
}
}
我在这里做错了什么?
答案 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);
现在,您应该可以轻松地将您的服务注入演员。