【问题标题】:CDI - ContextNotActiveException - WebBeans context with scope type annotation @RequestScoped does not exist within current threadCDI - ContextNotActiveException - 具有范围类型注释 @RequestScoped 的 WebBeans 上下文在当前线程中不存在
【发布时间】:2015-06-09 06:15:46
【问题描述】:

环境:WAS 8.0.0.10 CDI:1.0(实现 OpenWebBeans)

用例:服务器通过 TimerManager 异步执行 Java 类。我正在尝试将具有请求范围的 cdi bean 注入到类中,但是当在注入上调用任何方法时,下面是我得到的堆栈跟踪。如果我在注入中使用 Applicationscope 而不是 RequestScope,则代码可以正常工作。

在调查该问题后,我发现请求和会话上下文对于由容器异步初始化的线程不会处于活动状态。有什么方法可以初始化请求和会话上下文?

错误:

javax.enterprise.context.ContextNotActiveException: WebBeans context with scope type annotation @RequestScoped does not exist within current thread**
                at org.apache.webbeans.container.BeanManagerImpl.getContext(BeanManagerImpl.java:358)
                at org.apache.webbeans.intercept.NormalScopedBeanInterceptorHandler.getContextualInstance(NormalScopedBeanInterceptorHandler.java:124)
                at org.apache.webbeans.intercept.NormalScopedBeanInterceptorHandler.invoke(NormalScopedBeanInterceptorHandler.java:95)
                at com.ford.it.processcontrol.TestJob3_$$_javassist_22.executeJobCB(TestJob3_$$_javassist_22.java)

【问题讨论】:

  • 有人可以帮忙吗?

标签: cdi openwebbeans


【解决方案1】:

我假设你已经有了这个,或者类似的东西:

CdiContainer cdiContainer = CdiContainerLoader.getCdiContainer();    
cdiContainer.boot();
ContextControl contextControl = cdiContainer.getContextControl();

然后,您可以通过某种方式访问​​ ContextControl 实例。然后你可以在任何需要的地方启动上下文,只要记住在不再需要时停止它

try{
 //start
 contextControl.startContext(RequestScoped.class);

 // do stuff

}catch(Exception e){}
finally{
 //stop
 contextControl.stopContext(RequestScoped.class);   
}

这在一些异步类中对我有用。

希望对您有所帮助。 问候!

【讨论】:

  • 我的代码是在服务器环境中执行的,我不需要启动 CDI 容器并手动启动它,服务器会处理这个。
  • 现在,正如我上面提到的,WAS 具有用于异步任务的 TimerManager 接口(作为 commonJ 规范的一部分,而不是 J2ee 规范的一部分)。我的要求是在从 TimerManager 异步启动的线程期间让 RequestScope 处于活动状态。
  • deltaspike ctrl 模块中的 ContextControl 看起来很有趣。我尝试使用它,但似乎我没有合适的罐子,我得到 noclassdef 发现 WebBeansContext 异常。似乎 WebBeansContext 是 openwebbeans-impl-xxx 的一部分,将其添加到类路径也不能解决我的问题,它只会更改错误消息。 WAS 8 将其内部的 openwebbeans 作为 cdi 实现。因此,添加外部 jar 既没有意义也没有解决问题。
  • 哦,我以为 ContextControl 是 OpenWebBeans 的一部分,但它似乎只属于 Deltaspike 实现。好吧,就我而言,我让 Quartz 运行异步作业,并且我的作业使用 ApplicationScoped 进行注释。我在尝试使用注入的 EntityManager 时也得到了“ContextNotActiveException”,所以我像我提到的那样使用 contextControl.startContext() 启动 RequestScoped
  • WAS 8.0.0.7 也没有为异步线程激活 ApplicationScope,但作为 WAS 8.0.0.10 修复包的一部分,WAS 修复了这个问题。因此,在我的情况下,Application 范围可用于异步线程,但不适用于 RequestScope 和 Session 范围。您使用什么 jar 来使 contextControl.startContext() 工作?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-14
  • 2015-08-30
  • 2013-08-18
  • 2014-06-02
  • 1970-01-01
  • 2016-06-08
  • 1970-01-01
相关资源
最近更新 更多