5

セッションスコープの CDI Bean をステートレス EJB に注入したいと考えています。EJB のアクセス時に、sessionscoped cdi Bean の正しいインスタンス (つまり、呼び出し元の sessionscope にあるインスタンス) を使用する必要があります。ステートフル EJB でこれを解決できることはわかっていますが、CDI でも解決できるかどうか知りたいです。EJB とサーブレットは同じ war で実行されるため、それらは同じスレッドを共有し、コンテナは EJB で正しいセッション スコープ Bean を見つけられるはずだと思いますか?

例えば:

EJB:

@Stateless
@LocalBean
public class StatelessSessionBean {

    @Inject    
    Instance<SessionData> sessionData;    

    public String testMethod() {
        SessionData bean = sessionData.get();
        String result = "Retrieved bean " + bean + " with UUID "+ bean.uuid + ". Created on: " + new SimpleDateFormat("dd.MM.yyyy HH:mm").format(bean.creationDate);
        return result;
    }
}

CDI ビーン:

@SessionScoped
public class SessionData implements Serializable {      

    String uuid;
    Date creationDate;

    public SessionData() {
        uuid = UUID.randomUUID().toString();
        creationDate = new Date();
    }    
}

サーブレットなどからステートレス EJB にアクセスするとき、呼び出し元の HTTPSession に関連付けられている CDI Bean を testMethod で使用したいと考えています。したがって、異なるブラウザ/http セッションから 2 つのクライアントがサーブレットにアクセスする場合、両方とも異なる結果文字列を取得する必要があります。

Providerの代わりにCDI が必要Instanceですか? はいの場合、特定のセッションに対して Bean の正しいインスタンスを生成するにはどうすればよいですか? おそらく BeanManager を取得して SessionData のインスタンスを検索することを考えましたが、正しいものを取得する方法がわかりません。

どんな助けでも大歓迎です、ありがとう!

4

2 に答える 2