2016-05-09 18 views
0

Ich versuche, OWB (mit MyFaces & Primefaces) auf Tomcat 8.0.33 arbeiten. Es scheint so, egal wie ich die Dinge so konfigurieren, ich diesen Fehler ...OpenWebBeans + MyFaces + Tomcat = IllegalStateException

org.apache.myfaces.webapp.AbstractFacesInitializer.initFaces An error occured while initializing MyFaces: It's not allowed to call getBeans(Type, Annotation...) before AfterBeanDiscovery 

... dieses Stacktrace gefolgt:

java.lang.IllegalStateException: It's not allowed to call getBeans(Type, Annotation...) before AfterBeanDiscovery 
    at org.apache.webbeans.container.InjectableBeanManager.checkAfterBeanDiscoveryProcessed(InjectableBeanManager.java:402) 
    at org.apache.webbeans.container.InjectableBeanManager.getBeans(InjectableBeanManager.java:121) 
    at org.apache.myfaces.cdi.util.CDIUtils.lookup(CDIUtils.java:45) 
    at org.apache.myfaces.flow.cdi.DefaultCDIFacesFlowProvider.getAnnotatedFlows(DefaultCDIFacesFlowProvider.java:51) 
    at org.apache.myfaces.flow.impl.AnnotatedFlowConfigurator.configureAnnotatedFlows(AnnotatedFlowConfigurator.java:42) 
    at org.apache.myfaces.config.FacesConfigurator.configureFlowHandler(FacesConfigurator.java:1666) 
    at org.apache.myfaces.config.FacesConfigurator.configure(FacesConfigurator.java:608) 
    at org.apache.myfaces.webapp.AbstractFacesInitializer.buildConfiguration(AbstractFacesInitializer.java:416) 
    at org.apache.myfaces.webapp.Jsp21FacesInitializer.initContainerIntegration(Jsp21FacesInitializer.java:73) 
    at org.apache.myfaces.webapp.AbstractFacesInitializer.initFaces(AbstractFacesInitializer.java:172) 
    at org.apache.myfaces.webapp.StartupServletContextListener.contextInitialized(StartupServletContextListener.java:121) 
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4809) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5251) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147) 
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:725) 
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701) 
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717) 
    at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1696) 
    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:497) 
    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300) 
    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:484) 
    at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:433) 
    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:497) 
    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:300) 
    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:1471) 
    at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76) 
    at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1312) 
    at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1404) 
    at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:832) 
    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:497) 
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:323) 
    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:568) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$256(TCPTransport.java:683) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 

Nach dem, was ich here, here gelesen haben, und here (und etwa fünf bajillion andere Plätze), habe ich es versucht, mit die Tomcat-Plugin Abhängigkeit, mit der OWB Zuhörer in web.xml angegeben, und sogar mit beide von ihnen. Es scheint so, als ob ich, egal was ich tue, OWB anscheinend nicht davon überzeugen kann, sein Ding zu machen, bevor MyFaces hereinspringt und anfängt, sein Ding zu machen. Fehle ich etwas Außergewöhnliches oder etwas?

// Maven Dependencies 
com.amazonaws:aws-java-sdk-dynamodb:1.10.72 

org.apache.myfaces.core:myfaces-api:2.2.10 
org.apache.myfaces.core:myfaces-impl:2.2.10 

org.apache.openwebbeans:openwebbeans-spi:1.6.3 
org.apache.openwebbeans:openwebbeans-impl:1.6.3 
org.apache.openwebbeans:openwebbeans-web:1.6.3 
org.apache.openwebbeans:openwebbeans-jsf:1.6.3 
org.apache.openwebbeans:openwebbeans-el22:1.6.3 
org.apache.openwebbeans:openwebbeans-tomcat7:1.6.3 

org.apache.geronimo.specs:geronimo-atinject_1.0_spec:1.0 
org.apache.geronimo.specs:geronimo-jcdi_1.1_spec:1.0 
org.apache.geronimo.specs:geronimo-interceptor_1.2_spec:1.0 
org.apache.geronimo.specs:geronimo-annotation_1.2_spec:1.0 

javax.enterprise:cdi-api:1.2 
javax.validation:validation-api:1.1.0.Final 
org.hibernate:hibernate-validator:5.2.4.Final 

org.primefaces:primefaces:5.3 
org.primefaces.themes:dark-hive:1.0.10 

com.google.guava:guava:19.0 
com.google.code.gson:gson:2.5 

org.jetbrains:annotations:15.0 
+1

Es sieht aus wie etwas in myfaces issue tracker untersucht werden. Wenn Sie auch ein Beispiel einreichen können, könnte das hilfreich sein. Bitte erstellen Sie ein Problem [hier] (https://issues.apache.org/jira/browse/MYFACES). – lu4242

Antwort

0

sollten Sie ContextLifecycleListener.java

Änderung addOwbListeners() -Methode unter

private void addOwbListeners(StandardContext context) { 
    String[] oldListeners = context.findApplicationListeners(); 
    LinkedList<String> listeners = new LinkedList<String>(); 

    // 3rd 
    listeners.addFirst("org.apache.myfaces.webapp.StartupServletContextListener"); 
    // 2nd 
    listeners.addFirst("org.apache.webbeans.web.tomcat7.ContextLifecycleListener"); 
    // 1st 
    listeners.addFirst("org.apache.webbeans.servlet.WebBeansConfigurationListener"); 

    for (String listener : oldListeners) { 
    listeners.add(listener); 
    context.removeApplicationListener(listener); 
    } 

    for (String listener : listeners) { 
    context.addApplicationListener(listener); 
    } 
} 

dieser Klasse gemeinsam Classloader des Katers geladen verwenden. nicht webapp context classloader. https://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html

/META-INF/context.xml

<Context> 
    <Listener className="mypackage.ContextLifecycleListener" /> 
    <Resource name="BeanManager" auth="Container" 
    type="javax.enterprise.inject.spi.BeanManager" 
    factory="org.apache.webbeans.container.ManagerObjectFactory" /> 
</Context> 

/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app 
    xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
    version="3.1" metadata-complete="false" 
> 
<servlet> 
    <servlet-name>facesServlet</servlet-name> 
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>facesServlet</servlet-name> 
    <url-pattern>*.xhtml</url-pattern> 
</servlet-mapping> 
<resource-ref> 
    <res-ref-name>BeanManager</res-ref-name> 
    <res-type>javax.enterprise.inject.spi.BeanManager</res-type> 
    <res-sharing-scope>Shareable</res-sharing-scope> 
</resource-ref> 
</web-app> 
+0

wird nicht viel helfen, fürchte ich. Wahrscheinlich ist es ein Fehler in MyFaces. Ich erinnere mich, dass ich etwas Ähnliches gefunden habe und dass wir es auch schon repariert haben. OWB macht es richtig. Der Grund für die Ausnahme besteht darin, zufällige Fehler zu vermeiden: Wenn Sie getBeans() während des Bootens des Containers verwenden, könnten Sie wahrscheinlich alle Arten von zufälligem Verhalten durch unterschiedliche Klassenscanreihenfolge usw. verursachen CDI-Spezifikation bereits. Das wird sogar von der Spezifikation verlangt. – struberg