我有一个相当标准的架构,其中PrimeFaces
页面调用用javax.inject.@Named
和javax.enterprise.context.@SessionScoped
注释的类中的登录操作。
doLogin()
方法从FacesContext.getCurrentInstance()
接收null,即使Faces Servlet应该被正确调用。
有很多帖子本质上说,"FacesContext.getCurrentInstance()
唯一返回null的时间是在托管bean线程外部调用它时"。但我确实在另一个论坛上发现了一篇帖子,指出了导致它的构建/类加载器问题。不知何故,由于指定的依赖项不正确,你的FacesContext
类可以为容器加载,也可以为应用程序再次加载。所以,应该是一个单身汉变成了两个单身汉(不知怎么的…?)。无论如何,我发布这篇文章是为了记录修复情况,而不是为了完全解释症状背后的问题。
我使用JBoss Developer Studio
,使用Maven
构建JBoss EAP 6.2
。EAP
附带了用于JSF 1
和JSF 2.1
的模块。我想使用2.1,它存储在这里:
C:JBossjboss-eap-6.2.0modulessystemlayersbasejavaxfacesapimain.
在我的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
也可以通过在POM
中为创建了构建插件的ejb
项目放置归档配置来实现这一点:
<!-- 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插件或ejb-war插件进行构建,则可以使用相同的<archive>...</archive>
定义。