我们最近已经迁移到Tomcat 8.5.4 ( 8.5.3)和OmniFaces2.4( 2.3),我们还在我们的Web应用程序中改变了一些东西。从那时起,我们的Web应用程序不再启动,日志中有以下例外:
Exception sending context initialized event to listener instance of class org.omnifaces.ApplicationListener
java.lang.ExceptionInInitializerError
at org.omnifaces.ApplicationListener.checkCDIAvailable(ApplicationListener.java:77)
at org.omnifaces.ApplicationListener.contextInitialized(ApplicationListener.java:61)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4716)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5178)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:152)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1403)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1393)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
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)
Caused by: java.lang.IllegalStateException: CDI BeanManager instance is not available in JNDI.
at org.omnifaces.config.BeanManager.<init>(BeanManager.java:100)
at org.omnifaces.config.BeanManager.<clinit>(BeanManager.java:49)
... 11 more
Caused by: java.lang.IllegalStateException: javax.naming.NamingException: WELD-001300: Unable to locate BeanManager
at org.omnifaces.util.JNDI.lookup(JNDI.java:95)
at org.omnifaces.config.BeanManager.<init>(BeanManager.java:96)
... 12 more
Caused by: javax.naming.NamingException: WELD-001300: Unable to locate BeanManager
at org.jboss.weld.resources.ManagerObjectFactory.getObjectInstance(ManagerObjectFactory.java:62)
at org.apache.naming.factory.FactoryBase.getObjectInstance(FactoryBase.java:94)
at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:321)
at org.apache.naming.NamingContext.lookup(NamingContext.java:840)
at org.apache.naming.NamingContext.lookup(NamingContext.java:160)
at org.apache.naming.NamingContext.lookup(NamingContext.java:828)
at org.apache.naming.NamingContext.lookup(NamingContext.java:160)
at org.apache.naming.NamingContext.lookup(NamingContext.java:828)
at org.apache.naming.NamingContext.lookup(NamingContext.java:174)
at org.apache.naming.SelectorContext.lookup(SelectorContext.java:163)
at javax.naming.InitialContext.lookup(InitialContext.java:417)
at org.omnifaces.util.JNDI.lookup(JNDI.java:90)
... 13 more
Exception sending context initialized event to listener instance of class com.sun.faces.config.ConfigureListener
java.lang.RuntimeException: java.lang.NoClassDefFoundError: Could not initialize class org.omnifaces.config.BeanManager
at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:292)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4714)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5178)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:152)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1403)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1393)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
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)
Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.omnifaces.config.BeanManager
at org.omnifaces.util.Beans.getManager(Beans.java:88)
at org.omnifaces.util.Beans.getReference(Beans.java:113)
at org.omnifaces.application.OmniApplication.<init>(OmniApplication.java:70)
at org.omnifaces.application.OmniApplicationFactory.createOmniApplication(OmniApplicationFactory.java:89)
at org.omnifaces.application.OmniApplicationFactory.getApplication(OmniApplicationFactory.java:54)
at com.sun.faces.application.InjectionApplicationFactory.getApplication(InjectionApplicationFactory.java:93)
at com.sun.faces.config.InitFacesContext.getApplication(InitFacesContext.java:142)
at com.sun.faces.lifecycle.ClientWindowFactoryImpl.<init>(ClientWindowFactoryImpl.java:62)
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:405)
at javax.faces.FactoryFinderInstance.getImplementationInstance(FactoryFinderInstance.java:251)
at javax.faces.FactoryFinderInstance.getFactory(FactoryFinderInstance.java:543)
at javax.faces.FactoryFinder.getFactory(FactoryFinder.java:283)
at com.sun.faces.config.processor.FactoryConfigProcessor.verifyFactoriesExist(FactoryConfigProcessor.java:328)
at com.sun.faces.config.processor.FactoryConfigProcessor.process(FactoryConfigProcessor.java:236)
at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:439)
at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:227)
我们的配置:
BeanManager资源条目:
<Resource name="BeanManager"
auth="Container"
type="javax.enterprise.inject.spi.BeanManager"
factory="org.jboss.weld.resources.ManagerObjectFactory"/>
我们回到Tomcat 8.5.3和全方位2.3,并尝试了不同的组件版本组合(8.5.3与2.4,8.5.4与2.3,等等)。为了找出问题的根源,却无济于事。
最后,我们怀疑在初始化所有这些组件(Tomcat、Weld、Onmnifaces、.)之间存在一个竞赛条件问题。
最后,我从上下文XML文件中删除了BeanManager资源条目。
从上下文中删除:
<Resource name="BeanManager"
auth="Container"
type="javax.enterprise.inject.spi.BeanManager"
factory="org.jboss.weld.resources.ManagerObjectFactory"/>
它解决了问题。
我查看了Tomcat 8.5.4的更改日志,可以找到这个更改:
不要试图在web应用程序初始化阶段启动web资源,因为web应用程序在这一点上没有完全配置,并且web资源可能没有正确配置。(markt)
我不知道Tomcat更改日志中报告的这个Web应用程序的初始化阶段问题是否与我们遇到的问题有关。将BeanManager资源从上下文中删除的原因仍然不清楚。
有什么想法吗?
发布于 2016-09-01 23:19:43
javax.naming.NamingException:焊缝-001300:无法定位BeanManager
这基本上意味着找到了BeanManager
JNDI资源定义(如context.xml
中定义的那样),但尚未创建JNDI资源后面的具体BeanManager
实例。
这确实与Tomcat8.5.4中的描述的变化相匹配。
不要试图在web应用程序初始化阶段启动web资源,因为web应用程序在这一点上没有完全配置,并且web资源可能没有正确配置。(markt)
我不知道马克·托马斯对这一决定的推理,也没有问题的联系。我猜他试图避免由潜在的初始化排序问题引起的间歇性中断部署所造成的混乱行为。这也许是件好事,但我认为Mark实际上忽略了通过<ordering>
元素在web.xml
和web-fragment.xml
文件中定义初始化顺序的可能性。我确实记得,Tomcat在@WebListener
-annotated的调用顺序或以编程方式创建的实例(然而,对于<listener>
声明的实例)的调用顺序方面从来没有遵守过这一点。也许Mark应该修复这个部分,而不是在初始化阶段完全禁用JNDI。
至于OmniFaces 2.4中的更改,根据第243期,该版本在特定于Weld的servlet上下文属性中添加了一个回退。这将在JNDI资源不存在时使用,而Weld则用作CDI实现。也就是说,Weld内部也将BeanManager实例存储为servlet上下文属性,这样OmniFaces就可以在不需要JNDI的情况下获取它。这意味着,context.xml
不再是必要的。在Tomcat8.5.4中,您实际上也应该删除context.xml
,因为OmniFaces 2.4仍然首先尝试检查JNDI资源,这最终会引发异常,因为由于Tomcat8.5.4的更改,BeanManager
实例出乎意料地不可用。
在OmniFaces 2.5中,CDI初始化已经按照描述CDI1.0到1.1的迁移的第281期进行了重新处理和改进。OmniFaces不再使用JNDI检查BeanManager
。OmniFaces现在将使用CDI1.1引入的CDI
API。
BeanManager beanManager = CDI.current().getBeanManager();
这与JNDI配置/初始化无关。
OmniFaces 2.5还不是最终版本,但截至昨天,2.5-RC1已在Maven中心上市。
https://stackoverflow.com/questions/39267243
复制