2

私はかなり標準的なアーキテクチャを使用しており、ページはとPrimeFacesの注釈が付けられたクラスでログイン アクションを呼び出します。javax.inject.@Namedjavax.enterprise.context.@SessionScoped

Faces サーブレット適切に呼び出す必要がある場合でも、このdoLogin()メソッドは から null を受け取ります。FacesContext.getCurrentInstance()

4

1 に答える 1

1

FacesContext.getCurrentInstance()基本的に「 null を返すのは、マネージド Bean スレッドの外部で呼び出されたときだけです」という投稿が多数あります。しかし、別のフォーラムで、それを引き起こすビルド/クラス ローダーの問題を特定した 1 つの投稿を見つけました。どういうわけか、不適切に指定された依存関係が原因で、FacesContextクラスがコンテナー用に読み込まれ、アプリ用に再度読み込まれる可能性があります。つまり、シングルトンのはずが 2 つのシングルトンに変わります (どういうわけか...?)。とにかく、私はこれを投稿して修正を記録しますが、症状の背後にある問題を完全に説明するためではありません.

を使用して、 forJBoss Developer Studioで構築しています。とのモジュールが付属しています。ここに保存されている2.1を使用したい:MavenJBoss EAP 6.2EAPJSF 1JSF 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の にアーカイブ構成を配置することによっても実行できます。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エントリはすでにそこにあり、既存の .xml ファイルにアーカイブ定義を追加しただけ<configuration>です。ejb-jar-plugin または ejb-war-plugin でビルドしている場合は、同じ<archive>...</archive>定義を使用できると思います。

于 2015-03-30T20:42:40.090 に答える