Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
M1, M2, M3, M4, 1.0.0-alpha-2, 1.0.0-alpha-1, 1.0.0, 1.1.0
-
None
-
Win2003 Server
Description
The CDI specification in 6.7.1. Request context lifecycle states that the request scope is active during any remote method invocation of any EJB, during any asynchronous method invocation of any EJB, during any call to an EJB timeout method and during message delivery to any EJB message-driven bean, and during any message delivery to a MessageListener for a JMS topic or queue obtained from the Java EE component environment.
Currently the OpenWebBeansEjbInterceptor does two broad things
- activate and deactive request and application contexts
- call OWB Interceptors and decorators applicable to the EJB
This doesn't work correctly if a request scoped bean is injected in an old style JEE5 EJB interceptor. According to the spec. the old EJB interceptors run before the JSR299 interceptors and decorators. However there is no request scope when a CDI injection occurs in the EJB interceptor because the request scope is established LATER by the OpenWebBeansEjbInterceptor after all the EJB interceptors have run.
This results in an exception like this ..
javax.ejb.EJBException: Injection failure; nested exception is: javax.enterprise.context.ContextNotActiveException: WebBeans context with scope type annotation @RequestScoped does not exist within current thread
Caused by: 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:309)
at org.apache.webbeans.intercept.NormalScopedBeanInterceptorHandler.getContextualInstance(NormalScopedBeanInterceptorHandler.java:123)
at org.apache.webbeans.intercept.NormalScopedBeanInterceptorHandler.invoke(NormalScopedBeanInterceptorHandler.java:94)
at com.ibm.ws.fat.jcdi.beans.CurrentUser_$$javassist_4.toString(CurrentUser$$_javassist_4.java)
The solution to this problem is to take a sandwich approach to configuring interceptors. i.e Split OpenWebBeansEjbInterceptor into two
FirstEJBInterceptor .... establishes and tears down OWB request and application context
EJB Interceptor-1
EJB Interceptor- 2
OpenWebBeansEjbInterceptor .. setsup the JCDI runtime to call OWB Interceptors and decorators applicable to the EJB
OWB Interceptor-1
OWB decorator
The FirstEJBInterceptor is responsible for ensuring the request context is active during requests to EJBs and has to be innermost or the first interceptor in the stack for all EJBs. Without this interceptor Apache OWB cannot do injection of request scoped or application scoped beans in the older JEE5 EJB Interceptors.
--Thank You