即使在托管bean线程中,FacesContext.getCurrentInstance()也返回null

时间:2015-03-30 20:40:30

标签: jsf nullpointerexception jboss-eap-6 facescontext

我有一个相当标准的目录,其中PrimeFaces页面在使用javax.inject.@Namedjavax.enterprise.context.@SessionScoped注释的类中调用登录操作。

doLogin()方法从FacesContext.getCurrentInstance()接收空回,即使正确调用Faces Servlet

1 个答案:

答案 0 :(得分:1)

有许多帖子基本上说,“唯一的时间FacesContext.getCurrentInstance()将返回null是在托管bean线程之外调用它”。但我确实在另一个论坛上发现了一个帖子,该帖子确定了导致它的构建/类加载器问题。不知何故,由于指定的依赖项不正确,您的FacesContext类可以为容器加载,也可以为应用程序加载。那么应该是单身人士会变成两个单身人士(不知何故......?)。无论如何,我发布这个来记录修复,而不是完全解释症状背后的问题。

我正在使用JBoss Developer Studio,使用Maven构建JBoss EAP 6.2EAP附带JSF 1JSF 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,如上所述上方。

解决方案是:在我的POM和我的ejb项目的web中,我添加了此依赖项:

<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-plugin或ejb-war-plugin构建,可以使用相同的<archive>...</archive>定义。