Uploaded image for project: 'OpenWebBeans'
  1. OpenWebBeans
  2. OWB-423

OpenWebBeansEjbInterceptor is LATE in establishing the request context for an EJB

    XMLWordPrintableJSON

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
    • 1.2.0
    • Java EE Integration
    • 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

      Attachments

        Activity

          People

            struberg Mark Struberg
            kelapure Rohit Dilip Kelapure
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved:

              Time Tracking

                Estimated:
                Original Estimate - 24h
                24h
                Remaining:
                Remaining Estimate - 24h
                24h
                Logged:
                Time Spent - Not Specified
                Not Specified