リクエストから EJB への HTTP ヘッダーに含まれる情報を渡す必要がありますが、パラメーターを追加して、必要な場所に渡したくありません。そこで、ヘッダー値を保持するために RequestScoped Bean を使用しました。この実装は問題ありませんか、それとも @RecuestScoped Bean の概念を誤解していますか?
まず、インターセプター (Resteasy) を使用してヘッダーを取得し、それらをリクエスト スコープBeanに保存します。
@Provider
@ServerInterceptor
public class SomeInterceptor implements PreProcessInterceptor {
@Inject
ApplicationRequestContext appContext;
@Override
public ServerResponse preProcess(HttpRequest request, ResourceMethod resourceMethod)
throws Failure, WebApplicationException {
List<String> values = request.getHttpHeaders().getRequestHeader("Some-Header");
if(values != null && values.size() > 0) {
appContext.setSomeHeader(values.get(0));
}
return null;
}
}
これは豆です:
@RequestScoped
public class ApplicationRequestContext implements Serializable {
private String someHeader;
public void setSomeHeader(String someHeader) {
this.someHeader = someHeader;
}
public String getSomeHeader() {
return someHeader;
}
}
次に、EJB から値 (リクエストごとに異なる) にアクセスできます。
@Stateless
public class CheckInWorkflow {
@Inject
ApplicationRequestContext appContext;
public void someEjbMethod() {
doSomethingWithThisHeaderValue(appContext.getSomeHeader());
}
}
@RequestScopedの説明に基づいて、これは期待どおりに機能するはずです。
リクエスト スコープはアクティブです。
- Web アプリケーションの任意のサーブレットの service() メソッド中、任意のサーブレット フィルタの doFilter() メソッド中、およびコンテナが任意の ServletRequestListener または AsyncListener を呼び出すとき、
- Java EE Web サービスの呼び出し中、
- EJB のリモート メソッド呼び出し中、EJB の非同期メソッド呼び出し中、EJB タイムアウト メソッドの呼び出し中、および
- EJB メッセージ駆動型 Bean へのメッセージ配信中、および Java EE コンポーネント環境から取得した JMS トピックまたはキューの MessageListener へのメッセージ配信中。