を使用してサービスに送信されるリクエストに対して検証を実行しようとしていますContainerRequestFilter
。すべてが正常に動作していますが、1つの問題があります-一部のフィルターはフィルターに適用されない場合でも、すべての要求がフィルターを通過します(1つのフィルターはResourceOneでのみ検証され、別のフィルターはResourceTwoでのみ検証されます)。
特定の条件下でリクエストに対してのみ呼び出されるようにフィルターを設定する方法はありますか?
それはブロッカーや障害ではありませんが、この種の動作を停止できると便利です:)
あなたはJersey 2.x(JAX-RS 2.0 APIの実装)を使用していると思います。
あなたの目標を達成するには、2つの方法があります。
1.名前バインディングを使用します。
1.1 @NameBindingでアノテーションが付けられたカスタムアノテーションを作成します。
@NameBinding
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnotationForResourceOne {}
1.2。あなたの注釈でフィルターを作成します:
@Provider
@AnnotationForResourceOne
public class ResourceOneFilter implements ContainerRequestFilter {
...
}
1.3。作成したフィルターを選択したリソースメソッドにバインドします。
@Path("/resources")
public class Resources {
@GET
@Path("/resourceOne")
@AnnotationForResourceOne
public String getResourceOne() {...}
}
2. DynamicFeatureを使用します。
2.1。フィルターを作成:
public class ResourceOneFilter implements ContainerRequestFilter {
...
}
2.2。javax.ws.rs.container.DynamicFeatureインターフェースを実装します。
@Provider
public class MaxAgeFeature implements DynamicFeature {
public void configure(ResourceInfo ri, FeatureContext ctx) {
if(resourceShouldBeFiltered(ri)){
ResourceOneFilter filter = new ResourceOneFilter();
ctx.register(filter);
}
}
}
このシナリオでは:
@Provider
。configure(...)
methodは、すべてのリソースメソッドに対して呼び出されます。ctx.register(filter)
フィルターをリソースメソッドにバインドします。この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加