2.12.5. 按资源方法过滤器和 Interceptors
有时,您希望过滤器或拦截器仅针对特定资源方法运行。您可以通过两种不同的方式进行此操作:
实施 DynamicFeature
Interface
DynamicFeature
接口包含回调方法,配置(ResourceInfo resourceInfo, FeatureContext context)
,该命令会针对每个部署的 JAX-RS 方法调用。ResourceInfo
参数包含有关当前正在部署的 JAX-RS 方法的信息。FeatureContext
是 可配置
接口的扩展。您可以使用此参数的 register()
方法绑定您要分配给此方法的过滤器和拦截器。
示例:使用动态功能接口
@Provider public class AnimalTypeFeature implements DynamicFeature { @Override public void configure(ResourceInfo info, FeatureContext context) { if (info.getResourceMethod().getAnnotation(GET.class) != null) AnimalFilter filter = new AnimalFilter(); context.register(filter); } } }
在上例中,您使用 AnimalTypeFeature
注册的提供程序必须实施其中一个接口。本例注册了必须实现以下接口之一的供应商 AnimalFilter
: ContainerRequestFilter
、ContainerInterceptor、Reader
Interceptor
、WriterInterceptor
或 Feature
。在这种情况下,AnimalFilter
将应用到所有标有 GET 注解的资源方法。详情请参阅动态功能文档。
使用 @NameBinding 注解
@NameBinding
的工作方式与 CDI 拦截器非常相似。您使用 @NameBinding
标注自定义注释,然后将该自定义注释应用到过滤器和资源方法。
示例:使用 @NameBinding
@NameBinding public @interface DoIt {} @DoIt public class MyFilter implements ContainerRequestFilter {...} @Path("/root") public class MyResource { @GET @DoIt public String get() {...} }
详情请参阅 NameBinding 文档。