私は、最初の JAX-RS 2 実装の 1 つである RestEasy 3.0.2 を使用しており、Tomcat 7 内でアプリケーションを実行しています。また、CDI アダプターを介して RestEasy と統合されている WELD を介して、アプリケーションでインジェクションを利用しています。これまでのところ、すべて正常に動作しています。
ここで、ContainerRequestFilter の実装を作成して、受信リクエストがリソースに到達する前に認証を実行できるようにしました。JAX-RS 標準では、@Provider アノテーションが付けられたすべてのリソースおよびその他すべての JAX-RS コンポーネントに対してインジェクションが可能であると規定されています。
これは私のフィルター実装の簡略化されたバージョンです:
@Provider
@Priority(Priorities.AUTHENTICATION)
public class AuthenticationFilter implements ContainerRequestFilter {
@Inject
AuthenticationProvider authenticationProvider;
@Override
public void filter(ContainerRequestContext requestContext) throws IOException {
authenticationProvider.authenticate(requestContext);
}
}
注: AuthenticationProviderは@RequestScopedです。
一般に、このソリューションは機能します。コンポーネントが挿入され、要求が期待どおりに処理されています。
しかし、フィルターがどの範囲にあるのかはまだ疑問です。アプリケーション スコープの場合、決定論的テストでは検出できない「おかしな」同時実行性の問題が明らかに発生します。
さまざまなドキュメント、ガイド、および例を調べましたが、フィルターを使用した注入を使用したり、フィルターのスコープについて何かを述べたりするものは見つかりませんでした。