JSF 2.3 - Servlet 4 - JavaEE 8 и Tomcat9: невозможно найти CDI BeanManager - PullRequest
0 голосов
/ 22 ноября 2018

Я пытаюсь перейти с JSF 2.1 на 2.3 / Servlet 4 / Tomcat 9, но у меня возникли некоторые проблемы с настройкой CDI.Я следовал этому руководству от BalusC, чтобы включить CDI на Tomcat 9 (в моем случае), но я все еще получаю это исключение при запуске моего приложения:

com.sun.faces.config.ConfigurationException: Factory 'javax.faces.lifecycle.ClientWindowFactory' was not configured properly.
    at com.sun.faces.config.processor.FactoryConfigProcessor.verifyFactoriesExist(FactoryConfigProcessor.java:357)
    at com.sun.faces.config.processor.FactoryConfigProcessor.process(FactoryConfigProcessor.java:243)
    at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:443)
    at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:237)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4641)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5109)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:743)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:719)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:695)
    at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1737)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:287)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
    at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:457)
    at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:406)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:287)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
    at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468)
    at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)
    at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309)
    at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1401)
    at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:357)
    at sun.rmi.transport.Transport$1.run(Transport.java:200)
    at sun.rmi.transport.Transport$1.run(Transport.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:573)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:834)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:688)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:687)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: javax.faces.FacesException: Unable to find CDI BeanManager
    at com.sun.faces.application.ApplicationImpl.isJsf23(ApplicationImpl.java:2714)
    at com.sun.faces.application.ApplicationImpl.addELResolver(ApplicationImpl.java:549)
    at javax.faces.application.ApplicationWrapper.addELResolver(ApplicationWrapper.java:611)
    at javax.faces.application.ApplicationWrapper.addELResolver(ApplicationWrapper.java:611)
    at org.jboss.weld.environment.servlet.jsf.WeldApplication.<init>(WeldApplication.java:72)
    at org.jboss.weld.environment.servlet.jsf.WeldApplicationFactory.getApplication(WeldApplicationFactory.java:46)
    at com.sun.faces.application.InjectionApplicationFactory.getApplication(InjectionApplicationFactory.java:88)
    at com.sun.faces.config.InitFacesContext.getApplication(InitFacesContext.java:153)
    at com.sun.faces.lifecycle.ClientWindowFactoryImpl.<init>(ClientWindowFactoryImpl.java:63)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at java.lang.Class.newInstance(Class.java:442)
    at javax.faces.FactoryFinderInstance.getImplGivenPreviousImpl(FactoryFinderInstance.java:391)
    at javax.faces.FactoryFinderInstance.getImplementationInstance(FactoryFinderInstance.java:255)
    at javax.faces.FactoryFinderInstance.getFactory(FactoryFinderInstance.java:529)
    at javax.faces.FactoryFinder.getFactory(FactoryFinder.java:292)
    at com.sun.faces.config.processor.FactoryConfigProcessor.verifyFactoriesExist(FactoryConfigProcessor.java:354)
    ... 48 more

Обратите внимание, что перед тем, как следовать руководству,У меня было то же исключение, но оно было выброшено из другого класса (com.sun.faces.el.ELUtils.java метод tryAddCDIELResolver(FacesCompositeELResolver composite)), а после гида оно выброшено из com.sun.faces.application.ApplicationImpl.java метода private boolean isJsf23().Моя версия библиотеки:

    <icefaces-ace.version>3.2.0</icefaces-ace.version>
    <javax.jms-api.version>2.0.1</javax.jms-api.version>
    <el-api.version>2.2</el-api.version>
    <javax.el-api.version>3.0.0</javax.el-api.version>
    <jstl.version>1.2</jstl.version>
    <javax.faces-api.version>2.3</javax.faces-api.version><!--JSF API-->
    <javax.faces.version>2.3.8</javax.faces.version> <!--Mojarra-->
    <javax.ws.rs-api.version>2.1.1</javax.ws.rs-api.version>
    <javax.servlet-api.version>4.0.1</javax.servlet-api.version>
    <javax.servlet.jsp.jstl-api.version>1.2.2</javax.servlet.jsp.jstl-api.version>
    <javaee-web-api.version>8.0</javaee-web-api.version>
    <weld-servlet-shaded.version>3.0.5.Final</weld-servlet-shaded.version>

Может кто-нибудь сказать мне, что я делаю неправильно?Большое спасибо.

РЕДАКТИРОВАТЬ

Вот фрагмент кода, который пытается найти BeanManager:

 public static BeanManager getCdiBeanManager(FacesContext facesContext) {
    BeanManager result = null;

    if (facesContext != null && facesContext.getAttributes().containsKey(RIConstants.CDI_BEAN_MANAGER)) {
        result = (BeanManager) facesContext.getAttributes().get(RIConstants.CDI_BEAN_MANAGER);
    } else if (facesContext != null && facesContext.getExternalContext().getApplicationMap().containsKey(RIConstants.CDI_BEAN_MANAGER)) {
        result = (BeanManager) facesContext.getExternalContext().getApplicationMap().get(RIConstants.CDI_BEAN_MANAGER);
    } else {
        try {
            InitialContext initialContext = new InitialContext();
            result = (BeanManager) initialContext.lookup("java:comp/BeanManager");
        }
        catch (NamingException ne) {
            try {
                InitialContext initialContext = new InitialContext();
                result = (BeanManager) initialContext.lookup("java:comp/env/BeanManager");
            }
            catch (NamingException ne2) {
            }
        }

        if (result == null && facesContext != null) {
            Map<String, Object> applicationMap = facesContext.getExternalContext().getApplicationMap();
            result = (BeanManager) applicationMap.get("org.jboss.weld.environment.servlet.javax.enterprise.inject.spi.BeanManager");
        }

        if (result != null && facesContext != null) {
            facesContext.getAttributes().put(RIConstants.CDI_BEAN_MANAGER, result);
            facesContext.getExternalContext().getApplicationMap().put(RIConstants.CDI_BEAN_MANAGER, result);
        }
    }

    return result;
}

Я добавилнекоторые точки останова для проверки не result' and it is really null but the FaceContext`.

...