有很多帖子基本上说,“FacesContext.getCurrentInstance() 唯一返回 null 的时间是在托管 bean 线程之外调用它时”。但是我确实在另一个论坛上找到了一篇帖子,该帖子确定了导致它的构建/类加载器问题。不知何故,由于不正确指定的依赖关系,您的 FacesContext 类可以为容器加载,然后再次为应用程序加载。那么应该是一个单例的东西变成了两个单例(不知何故......?)。无论如何,我发布这个是为了记录修复,而不是完全解释症状背后的问题。
我正在使用JBoss Developer Studio,使用Maven 构建JBoss EAP 6.2。 EAP 带有用于 JSF 1 和 JSF 2.1 的模块。我想用 2.1,它存储在这里:
C:\JBoss\jboss-eap-6.2.0\modules\system\layers\base\javax\faces\api\main.
在我的EJB 项目POM 中,我错误地添加了jsf-api <scope>compile 的依赖项,导致FacesContext.getCurrentInstance() 返回null,如上所述。
解决方案是:在我的ejb 和我的web 项目的POM 中,我添加了这个依赖项:
<dependency>
<groupId>org.jboss.spec.javax.faces</groupId>
<artifactId>jboss-jsf-api_2.1_spec</artifactId>
<scope>provided</scope>
</dependency>
为了确保我部署的 ejb 项目也告诉 JBoss 我需要确保它在它的 MANIFEST.MF 中发布:
Dependencies: javax.faces.api:main
Maven 也可以做到这一点,方法是将存档配置放入创建构建插件的 ejb 项目的 POM 中:
<!-- most of this <build> element was already in my POM -->
<build>
<plugins>
<plugin>
<artifactId>maven-ejb-plugin</artifactId>
<version>2.3</version>
<configuration>
<ejbVersion>3.1</ejbVersion>
<!-- I added this <archive> element to tell Maven to add the dependency line in MANIFEST.MF -->
<archive>
<manifestEntries>
<Dependencies>javax.faces.api:main</Dependencies>
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>
</build>
对我来说,maven-ejb-plugin 条目已经存在,我只是将存档定义添加到现有的 <configuration>。我假设如果您使用 ejb-jar-plugin 或 ejb-war-plugin 构建,可以使用相同的 <archive>...</archive> 定义。