@NameBinding
Jersey中的注释如何对特定资源方法或资源类应用过滤器?
考虑以下注释:
@NameBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface SomeAnnotaion{}
它是如何工作的?
@NameBinding
Jersey中的注释如何对特定资源方法或资源类应用过滤器?
考虑以下注释:
@NameBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface SomeAnnotaion{}
它是如何工作的?
名称绑定
名称绑定是一个概念,它允许对 JAX-RS 运行时说特定的过滤器或拦截器将仅针对特定的资源方法执行。当过滤器或拦截器仅限于特定的资源方法时,我们说它是名称绑定的。没有这种限制的过滤器和拦截器称为global。
定义名称绑定注释
可以使用
@NameBinding
注释将过滤器或拦截器分配给资源方法。此注释用作其他用户实现的注释的元注释,这些注释应用于提供者和资源方法。请参阅以下示例:@NameBinding @Retention(RetentionPolicy.RUNTIME) public @interface Compress {}
上面的例子定义了一个新的
@Compress
注解,它是一个名称绑定注解,因为它用@NameBinding
. 该@Compress
注释可用于绑定的过滤器和拦截器到端点。将过滤器或拦截器绑定到端点
假设您有一个执行 GZIP 压缩的拦截器,并且您希望将此类拦截器绑定到资源方法。为此,请同时注释资源方法和拦截器,如下所示:
@Compress public class GZIPWriterInterceptor implements WriterInterceptor { @Override public void aroundWriteTo(WriterInterceptorContext context) throws IOException, WebApplicationException { final OutputStream outputStream = context.getOutputStream(); context.setOutputStream(new GZIPOutputStream(outputStream)); context.proceed(); } }
@Path("helloworld") public class HelloWorldResource { @GET @Produces("text/plain") public String getHello() { return "Hello World!"; } @GET @Path("too-much-data") @Compress public String getVeryLongString() { String str = ... // very long string return str; } }
该
@Compress
应用的资源的方法getVeryLongString()
和拦截器GZIPWriterInterceptor
。只有在执行任何带有此类注释的资源方法时才会执行拦截器。在上面的例子中,拦截器将只为
getVeryLongString()
方法执行。不会为 method 执行拦截器getHello()
。在这个例子中,原因可能很清楚。我们只想压缩长数据,我们不需要压缩 的短响应"Hello World!"
。名称绑定可以应用于资源类。在示例
HelloWorldResource
中将用@Compress
. 这意味着在这种情况下所有资源方法都将使用压缩。请注意,始终执行全局过滤器,因此即使对于具有任何名称绑定注释的资源方法也是如此。
文档
@NameBinding
注释文档例子