在 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 中了。
此刻我正在处理一个棘手的问题。对于我的 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 中了。