3

リクエストから 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 へのメッセージ配信中。
4

1 に答える 1