【问题标题】:FacesContext.getCurrentInstance() returns null even in managed bean threadFacesContext.getCurrentInstance() 即使在托管 bean 线程中也返回 null
【发布时间】:2015-06-04 00:55:40
【问题描述】:

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

doLogin() 方法从 FacesContext.getCurrentInstance() 接收到 null,即使 Faces Servlet应该被正确调用。

【问题讨论】:

    标签: jsf nullpointerexception jboss-eap-6 facescontext


    【解决方案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,如上所述。

    解决方案是:在我的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 条目已经存在,我只是将存档定义添加到现有的 &lt;configuration&gt;。我假设如果您使用 ejb-jar-plugin 或 ejb-war-plugin 构建,可以使用相同的 &lt;archive&gt;...&lt;/archive&gt; 定义。

    【讨论】:

      猜你喜欢
      • 2014-10-15
      • 2011-06-14
      • 1970-01-01
      • 1970-01-01
      • 2012-02-26
      • 2017-03-20
      • 1970-01-01
      • 2016-06-11
      • 1970-01-01
      相关资源
      最近更新 更多