3

环境: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)
4

1 回答 1

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

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

希望能帮助到你。问候!

于 2015-06-10T15:03:34.357 回答