CDI - ContextNotActiveException - 当前线程

时间:2015-06-09 06:15:46

标签: cdi openwebbeans

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

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

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

错误:

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)

1 个答案:

答案 0 :(得分:0)

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

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

这对我来说是一些不合时宜的课程。

希望它有所帮助。 问候!