セッションスコープの 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 のインスタンスを検索することを考えましたが、正しいものを取得する方法がわかりません。
どんな助けでも大歓迎です、ありがとう!