在泽西岛中使用名称绑定批注

2022-09-02 23:38:08

在泽西岛,注释如何工作以对特定资源方法或资源类应用筛选器?@NameBinding

请考虑以下注释:

@NameBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface SomeAnnotaion{}

它是如何工作的?


答案 1

名称绑定

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

定义名称绑定批注

可以使用@NameBinding注释将筛选器或拦截器分配给资源方法。此注释用作应用于提供程序和资源方法的其他用户实现的注释的元注释。请参阅以下示例:

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

上面的示例定义了一个新的注释,它是一个名称绑定注释,因为它用@NameBinding进行注释。注释可用于将筛选器和侦听器绑定到终结点。@Compress@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;
    }
}

应用于资源方法和拦截器 。仅当执行任何具有此类注释的资源方法时,才会执行侦听器。@CompressgetVeryLongString()GZIPWriterInterceptor

在上面的示例中,将仅对该方法执行侦听器。不会对方法 执行拦截器。在这个例子中,原因可能很清楚。我们只想压缩长数据,而不需要压缩 的短响应。getVeryLongString()getHello()"Hello World!"

可以在资源类上应用名称绑定。在示例中,将使用 进行注释。这意味着在这种情况下,所有资源方法都将使用压缩。HelloWorldResource@Compress

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

文档

例子


答案 2