java.lang.NullPointerException 在 org.omnifaces.cdi.eager.EagerBeansWebListener.requestInitialized

java.lang.NullPointerException at org.omnifaces.cdi.eager.EagerBeansWebListener.requestInitialized

我正在使用 TomEE Plus 1.7.2 服务器并尝试启动包含 OmniFaces 的 Web 应用程序,但我收到空指针异常:

WARNUNG: Could not instantiate eager request scoped beans for request /index.xhtml. Possibly the CDI request scope is not active. If this is indeed the case, see JavaDoc on org.omnifaces.cdi.Eager on how to remedy this.

java.lang.NullPointerException at org.omnifaces.cdi.eager.EagerBeansWebListener.requestInitialized(EagerBeansWebListener.java:78)

当我使用 OmniFaces docs 处所示的 EagerBeansFilter 时,我得到了轻微的变化:

WARNUNG: Could not instantiate eager application scoped beans. Possibly the CDI application scope is not active. This is known to be the case in certain Tomcat and Jetty based configurations.

java.lang.NullPointerException at org.omnifaces.cdi.eager.EagerBeansRepository.instantiateApplicationScopedAndRegisterListener(EagerBeansRepository.java:69)

这个服务器不能与 omnifaces 结合使用吗?

TomEE 是仅次于 WildFly 的 OmniFaces 测试最多的服务器之一,特别是因为它在 Java EE 中的几乎所有地方都使用了与 WildFly(Apache 与 Oracle)不同的实现。在 OmniFaces compatibility matrix you can find TomEE versions which successfully ran through all pages in OmniFaces showcase.

你问题中提到的那些异常将在 CDI BeanManager couldn't find the OmniFaces EagerBeansRepository 时抛出,这是一个 @ApplicationScoped bean。这反过来表明 CDI 环境配置错误(例如错误的 beans.xml 或缺少 JNDI/listener 配置)或脏构建(例如重复的库)。验证 CDI 配置并执行完整 clean/rebuild 应该可以解决问题。

至少,OmniFaces 2.2 或更新版本在技术上与 TomEE 1.x 不兼容,因为 TomEE 1.x 附带 JSF 2.1,而 OmniFaces 2.2 或更新版本由于新 <o:viewAction>标签。因此,除非您修改 TomEE 以提供 JSF 2.2,否则 OmniFaces 2.2 或更新版本将不会部署并且应该会部署失败并出现以下异常:

java.lang.NoClassDefFoundError: javax/faces/component/UIViewAction

成功部署在原装 TomEE 1.7.x 服务器上的最新 OmniFaces 版本是 OmniFaces 2.1。如果您想在库存 TomEE 上使用 OmniFaces 2.2 或更新版本,则需要升级到 TomEE 7.x.