2013-10-31 57 views
0

如果webapp包含@Stateless ejb,我无法启动在Websphere上嵌入CODI的web应用程序。在Websphere Liberty配置文件中使用ejb无状态的CODI 8.5.5

我得到这个异常:

[ERROR ] null 
java.lang.reflect.InvocationTargetException 
[ERROR ] An error occured while initializing MyFaces: java.lang.reflect.InvocationTargetException 
java.lang.reflect.InvocationTargetException 
[ERROR ] Uncaught.init.exception.thrown.by.servlet 
    Faces Servlet 
    codiTest 
    javax.enterprise.context.ContextNotActiveException: WebBeans context with scope type annotation @ApplicationScoped does not exist within current thread 
    at org.apache.webbeans.container.BeanManagerImpl.getContext(BeanManagerImpl.java:342) 
    at [internal classes] 
    at org.apache.myfaces.extensions.cdi.core.api.config.CodiCoreConfig_$$_javassist_78.isAdvancedQualifierRequiredForDependencyInjection(CodiCoreConfig_$$_javassist_78.java) 
    at org.apache.myfaces.extensions.cdi.jsf.impl.listener.phase.PhaseListenerExtension.consumePhaseListeners(PhaseListenerExtension.java:110) 
    at org.apache.myfaces.extensions.cdi.jsf2.impl.listener.phase.CodiLifecycleFactoryWrapper.getLifecycle(CodiLifecycleFactoryWrapper.java:67) 
    at javax.faces.webapp.FacesServlet.init(FacesServlet.java:119) 
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.init(ServletWrapper.java:322) 
    at [internal classes] 

[ERROR ] SRVE0266E: Error occured while initializing servlets: javax.servlet.ServletException: SRVE0207E: Uncaught initialization exception created by servlet 
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.init(ServletWrapper.java:385) 
    at [internal classes] 
Caused by: javax.enterprise.context.ContextNotActiveException: WebBeans context with scope type annotation @ApplicationScoped does not exist within current thread 
    at org.apache.webbeans.container.BeanManagerImpl.getContext(BeanManagerImpl.java:342) 
    at [internal classes] 
    at org.apache.myfaces.extensions.cdi.core.api.config.CodiCoreConfig_$$_javassist_78.isAdvancedQualifierRequiredForDependencyInjection(CodiCoreConfig_$$_javassist_78.java) 
    at org.apache.myfaces.extensions.cdi.jsf.impl.listener.phase.PhaseListenerExtension.consumePhaseListeners(PhaseListenerExtension.java:110) 
    at org.apache.myfaces.extensions.cdi.jsf2.impl.listener.phase.CodiLifecycleFactoryWrapper.getLifecycle(CodiLifecycleFactoryWrapper.java:67) 
    at javax.faces.webapp.FacesServlet.init(FacesServlet.java:119) 
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.init(ServletWrapper.java:322) 
    ... 1 more 

[WARNING ] Unknown RenderKit 'HTML_BASIC'. 
[WARNING ] Unknown RenderKit 'HTML_BASIC'. 
[ERROR ] An exception occurred 
java.lang.IllegalArgumentException: Could not find a RenderKit for "HTML_BASIC" 

我constated,只有当一个EJB是存在于项目出现问题(在我的情况下,@Stateless EJB)。

在这种情况下,当服务器启动并且安装/部署webapp时,应用程序上下文被初始化。这里没问题。

当第一个HTTP请求被webapp处理时,FacesServlet被初始化并且CodiNavigationHandler被实例化。

方法CodiNavigationHandler.isAddViewConfigsAsNavigationCaseActivated()在构造函数中被调用并尝试获取CODI JsfModuleConfig上的引用。这JsfModuleConfig有一个@ApplicationScoped注释,beanManager试图获取应用程序上下文。

此应用程序上下文已经创建(部署web应用程序时),但尚未调用LibertyContextsService.initApplicationContext(String)。 因此应用程序上下文是在LibertyContextsService.applicationContexts ThreadLocal变量空,出现错误:

WebBeans context with scope type annotation @ApplicationScoped does not exist within current thread 

重现:

  • 创建动态Web项目
  • 下WEB添加一个几乎是空的beans.xml -INF(只是一个beans元素)
  • 在WEB-INF下添加一个几乎空的faces-config.xml(只是一个faces-config元素)
  • 在WEB-INF/lib中添加一个web.xml用面/的index.xhtml
  • 拷贝CODI罐子(http://www.apache.org/dyn/closer.cgi/myfaces/binaries/myfaces-extcdi-assembly-jsf20-1.0.5-bin.zip
  • 添加无状态Bean:

    import javax.annotation.PostConstruct; 
    import javax.ejb.Stateless; 
    
    @Stateless 
    public class MyBean { 
    
        @PostConstruct 
        public void postConstruct() { 
         System.out.println("post construct: " + this); 
        } 
    
        public String getTitle() { 
         return "test"; 
        } 
    } 
    
  • 添加JSF豆:

    import javax.inject.Inject; 
    import javax.inject.Named; 
    
    @Named 
    public class MyController { 
    
        @Inject 
        private MyBean myBean; 
    
        public String getTitle() { 
         return myBean.getTitle(); 
        } 
    } 
    
  • 添加一个简单的JSF页面有:

    <h:body> 
        <h:outputText>${myController.title}</h:outputText> 
    </h:body> 
    

nota:如果您删除了ejb上的@stateless,则应用程序可以工作。

+1

这可能是产品问题。我建议与IBM开放PMR。 –

回答

1

有效地,它似乎是一个错误(我也在IBM论坛发布的问题:https://www.ibm.com/developerworks/community/forums/html/topic?id=f372bbc5-5ba4-4c2a-9ef0-0bdcd76766da#09228314-2baf-4892-899e-5a8cc52daa19)。

我将尝试找到一种方法来创建PMR(我在一家大公司,很难找到合适的人,这将授予我访问权限)。

因此,现在我已经切换到jboss。

+0

你在PMR上得到了一些答案吗?也许我遇到了同样的问题。 – Sebastian

相关问题