在Jersey中使用名称绑定注释

在Jersey中使用名称绑定注释,第1张

在Jersey中使用名称绑定注释 名称绑定

名称绑定 是一个概念,它允许对JAX-RS运行时说,仅针对特定的资源方法才执行特定的过滤器或拦截器。当过滤器或拦截器仅限于特定资源方法时,我们说它是
名称绑定的 。没有这种限制的过滤器和拦截器称为 global

定义名称绑定注释

可以使用

@NameBinding
注释将过滤器或拦截器分配给资源方法。此批注用作其他用户实现的批注的元批注,这些其他用户实现的批注已应用于提供程序和资源方法。请参见以下示例:

@NameBinding@Retention(RetentionPolicy.RUNTIME)public @interface Compress {}

上面的示例定义了一个新

@Compress
注释,它是一个用注释的名称绑定注释
@NameBinding
。该
@Compress
注释可用于绑定的过滤器和拦截器到端点。

将过滤器或拦截器绑定到端点

考虑您有一个执行GZIP压缩的拦截器,并且您想将这种拦截器绑定到资源方法。为此,请注释资源方法和拦截器,如下所示:

@Compresspublic 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()
。在此示例中,原因可能很清楚。我们只想压缩长数据,而无需压缩的短响应
"HelloWorld!"

名称绑定可以应用于资源类。在示例

HelloWorldResource
中将用注释
@Compress
。这意味着在这种情况下,所有资源方法都将使用压缩。

请注意,全局过滤器始终执行,因此即使对于具有任何名称绑定批注的资源方法也是如此。

文献资料
  • @NameBinding
    注释文档
  • 泽西岛有关过滤器和拦截器的文档


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5130307.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-17
下一篇 2022-11-17

发表评论

登录后才能评论

评论列表(0条)

保存