2

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

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

4

1 回答 1

1

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

我正在使用JBoss Developer Studio, 构建Mavenfor JBoss EAP 6.2EAP带有用于JSF 1和的模块JSF 2.1。我想使用 2.1,它存储在这里:

C:\JBoss\jboss-eap-6.2.0\modules\system\layers\base\javax\faces\api\main.

在我的EJB项目POM中,我错误地添加了 for 的依赖项jsf-api <scope>compile,导致如上所述FacesContext.getCurrentInstance()返回。null

解决方案是:在POMejb和我的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放置存档配置来完成:POMejb

<!-- 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>可以使用相同的定义。

于 2015-03-30T20:42:40.090 回答