0

私は JSF 2 と EJB 3.1 を使用しています。それらはすべて Glassfish 3.1 にデプロイされています。

PhaseListener を実装した MyInterceptor という名前のクラスをセットアップすると、その中のリモート EJB インターフェイスを取り消すことができません。

「NullPointerException ...」に気付く

public class MyInterceptor implements PhaseListener {

@EJB(name="AuthorizationEJB", 
            beanInterface=AuthorizationService.class,
            mappedName="corbaname:iiop:localhost:3700#ejb/AuthorizationEJB")
public AuthorizationService authorizationService;

....

} 

私がauthorizationService.dosomestuff()を呼び出すと、エラーNullPointerExceptionが発生します

どうすれば修正できますか?

少し早いですがお礼を

4

3 に答える 3

3

残念ながら、JSF 2.1 以前では、PhaseListeners はインジェクション ターゲットではありません (つまり、それらでインジェクションを使用することはできません)。ただし、代わりに JNDI を介してプログラムでルックアップを行うことができます。

JSF 2.2 では、すべての JSF アーティファクト (PhaseListeners を含む) がインジェクション ターゲットになりますが、これはおそらく今は役に立たないでしょう。

あなたの質問とは関係ありませんがbeanInterface、注釈で を指定して何を達成しようとしているのかわかりません。ほとんどの場合、name属性も必要ありません。また、Bean がローカル Bean の場合は、 も必要ありませんmappedName

于 2012-04-08T21:37:40.580 に答える
2

承認を行うには、JSF フェーズ リスナーの代わりにサーブレット フィルターを使用します。@EJBにを注入できます@WebFilter

于 2012-04-10T12:36:31.233 に答える
0

ええ、Webフィルターでは、プレーンな@EJBを使用できました。2 つの Bean が同じAuthorizationServiceインターフェースを実装している場合、 beanNameを追加するために必要な最大数。 サーブレット フィルターはリクエストごとです。JSF のライフサイクルの特定のフェーズ (http リクエスト全体よりも細かいレベル) でセキュリティに関することを行う必要はないと思います。 通常の検索では、次のことができます。



AuthorizationService.class.cast(new InitialContext().lookup("corbaname:iiop:localhost:3700#ejb/AuthorizationEJB")).dosomestuff();

トライキャッチ javax.naming.NamingException

于 2012-04-14T12:10:18.437 に答える