2011-08-07 13 views
7

すべてのレイヤ(つまりWebレイヤ、EJBレイヤ)に@Inject @Current Userを使用して現在のユーザを注入したいとします。これを行うために、私は次のCDIプロデューサーの方法があります。EJBステートレスセッションBeanからCDIセッションスコーププロデューサメソッドを呼び出す

@Stateless 
public class SomeBackendService { 
    @Inject @Current 
    private User user; 
} 

私の質問を::次のように

@Named 
@SessionScoped 
public class UserController { 
    @Resource SessionContext sessionContext; 
    @EJB UserDao userDao; 

    @Produces @Current 
    public User getCurrentUser() { 
    String username = sessionContext.getCallerPrincipal().getName(); 
    User user = userDao.findByUsername(username); 
    } 
} 

@Qualifier 
@Target({TYPE, METHOD, PARAMETER, FIELD}) 
@Retention(RUNTIME) 
public @interface Current{} 

は今、私はEJBステートレスセッションBeanに現在のユーザーを注入したいですステートレスセッションBeanの依存関係は通常、作成時に一度注入され、Beanはプールされて別のセッションで使用される可能性があるため、現在のユーザーオブジェクトはセッションの変更後に常に再注入されますか?

答えて

4

この正確な状況は試していませんが、では、CDI Beanは通常再注入されません。代わりに、そのコンテキストを認識しているプロキシが注入されます。

このメカニズムを使用すると、セッションスコープのBeanをアプリケーションスコープのBeanに挿入することができます。アプリケーションスコープ付きBeanのすべてのユーザーは、同じBeanと同じプロキシに行きますが、プロキシはその上の呼び出しを各ユーザーの別のBeanに動的に解決します。

@Statelessのスコープが基本的に 'アプリケーション'であっても、あなたの `SomeBackendService 'にUserを表すプロキシが依然として正しいセッションスコープのバージョンに委任されている可能性があります。

p.s.

あなたが実際にEARの一部であり、WebおよびEJBモジュールのようなモジュールを意味層と、予想通りCDIは常に、モジュール間で機能しないよう、もう少し複雑になるだろう場合(特に中JBoss AS)。これは、部分的には、「申請」とその適用範囲がEAR内にあることのあいまいさによるものである。

+0

は完全にプロキシを忘れてしまった。このような状況を説明する質問を投稿しました。私はそれを試して、期待どおりに動作します。ありがとう。 – Theo

1

ステートレスセッションBeanはステート "User"を持つべきではありません。ステートレスです。

EJBに状態を持たせたい場合は、代わりに@Statefulを使用します。

1

はい、コンテナと呼ばれる各ビジネスメソッドには、SLSBのすべての依存関係が再注入されます。

"セッションBeanが依存性注入を使用する場合、コンテナはBeanインスタンスが作成された後、Beanインスタンスでビジネスメソッドが呼び出される前にこれらの参照を注入します。 " - 4.3.2

私も、この疑問を持っていたと私はhere

関連する問題