OpenWebBeansEjbInterceptor is LATE is in establishing the request context for 
an EJB
------------------------------------------------------------------------------------

                 Key: OWB-423
                 URL: https://issues.apache.org/jira/browse/OWB-423
             Project: OpenWebBeans
          Issue Type: Bug
          Components: Java EE Integration
    Affects Versions: M1, M2, M3, M4, 1.1.0, 1.0.0-GA, 1.0.0-alpha-4, 
1.0.0-alpha-3, 1.0.0-alpha-2, 1.0.0-alpha-1
         Environment: Win2003 Server
            Reporter: Rohit Dilip Kelapure
            Assignee: Gurkan Erdogdu


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 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



-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to