Java Play 2.5.x-没有绑定到此线程的EntityManager
我正在从Play 2.3.x迁移到2.5.x,我在从akka演员访问DB时遇到了一个问题。在应用程序启动期间,我将调度程序作为单例注入,并从中创建访问数据库的调度 参与者在构造函数中接收JPAAPI以访问DB,但每次尝试访问DB时,我都会收到下面的错误 有人能解决这个问题吗 我还应该注入HTTP上下文吗?我该怎么做 2017-03-23 11:46:16.990+0000-仪表板监视器接收:73-检查状态 java.lang.RuntimeException:JPA事务失败 atplay.db.jpa.DefaultJPAApi.withTransaction(DefaultJPAApi.java:198) 位于actors.DashboardMonitor.onReceive(DashboardMonitor.java:77) 在akka.actor.UntypedActor$$anonfun$receive$1.applyOrElse(UntypedActor.scala:165) 在akka.actor.actor$class.aroundReceive(actor.scala:484) 在akka.actor.UntypedActor.aroundReceive(UntypedActor.scala:95) 在akka.actor.ActorCell.receiveMessage(ActorCell.scala:526) 在akka.actor.ActorCell.invoke(ActorCell.scala:495) 在akka.dispatch.Mailbox.processMailbox(Mailbox.scala:257) 在akka.dispatch.Mailbox.run(Mailbox.scala:224) 在akka.dispatch.Mailbox.exec(Mailbox.scala:234) 位于scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) 位于scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) 位于scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) 在scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)中 原因:java.lang.RuntimeException:没有绑定到此线程的EntityManager。尝试在JPAApi.withTransaction中包装此调用,或确保在此线程上设置了HTTP上下文 at play.db.jpa.JPAEntityManagerContext.em(JPAEntityManagerContext.java:36) at play.db.jpa.jpa.em(jpa.java:75) 位于models.Probe.getAllProbes(Probe.java:270) 在utils.utils.updatePlatformStatus(utils.java:524) 在actors.DashboardMonitor.lambda$onReceive$0(DashboardMonitor.java:78) atplay.db.jpa.DefaultJPAApi.lambda$和事务$2(DefaultJPAApi.java:194) atplay.db.jpa.DefaultJPAApi.lambda$和事务$3(DefaultJPAApi.java:211) atplay.db.jpa.DefaultJPAApi.withTransaction(DefaultJPAApi.java:152) atplay.db.jpa.DefaultJPAApi.withTransaction(DefaultJPAApi.java:210) atplay.db.jpa.DefaultJPAApi.withTransaction(DefaultJPAApi.java:193) ... 还有13个 这是我使用的代码:Java Play 2.5.x-没有绑定到此线程的EntityManager,java,jpa,playframework-2.0,akka,Java,Jpa,Playframework 2.0,Akka,我正在从Play 2.3.x迁移到2.5.x,我在从akka演员访问DB时遇到了一个问题。在应用程序启动期间,我将调度程序作为单例注入,并从中创建访问数据库的调度 参与者在构造函数中接收JPAAPI以访问DB,但每次尝试访问DB时,我都会收到下面的错误 有人能解决这个问题吗 我还应该注入HTTP上下文吗?我该怎么做 2017-03-23 11:46:16.990+0000-仪表板监视器接收:73-检查状态 java.lang.RuntimeException:JPA事务失败 atplay.db.
@Singleton
public class DashboardMonitor extends UntypedActor {
private final JPAApi jpaApi;
@Inject
public DashboardMonitor(JPAApi jpaApi) {
this.jpaApi = jpaApi;
}
@Override
public void onReceive(Object message) throws Exception {
// check message type
if (message.equals("updateStatus")) {
try {
jpaApi.withTransaction(() -> {
Utils.updatePlatformStatus();
});
}catch (Exception e){
e.printStackTrace();
}
}
}
}
调度程序:
@Singleton
public class DashboardScheduler {
// Start aggregate session for aggregate probe
private Cancellable updateStatusSchedule = null;
@Inject
public DashboardScheduler(ApplicationLifecycle lifeCycle, ActorSystem system, @Named("dashboard-monitor") ActorRef dashboardActor) {
startUpdateStatus(system, dashboardActor);
initStopHook(lifeCycle);
}
/**
* Start probesTimedOutScheduler
*/
private void startUpdateStatus(ActorSystem system, ActorRef dashboardActor) {
if (updateStatusSchedule == null || updateStatusSchedule.isCancelled()) {
updateStatusSchedule = system.scheduler().schedule(
Duration.create(10, TimeUnit.SECONDS),
Duration.create((GlobalConfiguration.probeUpdateInterval), TimeUnit.SECONDS),
dashboardActor,
"updateStatus",
system.dispatcher(),
null);
}
}
}
注入模块:
public class GlobalBootstrapModule extends AbstractModule implements AkkaGuiceSupport {
@Override
protected void configure() {
bindActor(DashboardMonitor.class, "dashboard-monitor");
bind(DashboardScheduler.class).asEagerSingleton();
}
}
你看到这个了吗?您的应用程序上似乎没有注入实体管理器。您看到了吗?您的应用程序上似乎没有注入实体管理器。