java - 在 Jersey 中使用名称绑定(bind)注释

标签 java rest jersey

@NameBinding 注释如何在 Jersey 中工作以对特定资源方法或资源类应用过滤器?

考虑以下注释:

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

它是如何工作的?

最佳答案

名称绑定(bind)

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

定义名称绑定(bind)注解

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

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

上面的例子定义了一个新的@Compress注解,它是一个名称绑定(bind)注解,因为它被注解为@NameBinding。 . @Compress 注释可用于将过滤器和拦截器绑定(bind)到端点。

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

假设您有一个执行 GZIP 压缩的拦截器,并且您希望将此类拦截器绑定(bind)到资源方法。为此,请注释资源方法和拦截器,如下所示:

@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() 方法执行。不会为方法 getHello() 执行拦截器。在这个例子中,原因可能很清楚。我们只想压缩长数据,不需要压缩 "Hello World!" 的短响应。

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

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

文档

例子

关于java - 在 Jersey 中使用名称绑定(bind)注释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38520881/

相关文章:

java - 具有基本 HTTP 身份验证的 CORS

java - 使用ObjectMapper转换为Json时,如何将POJO的String变量转换为Integer?

java - ant卸载android包

django - 枚举 Django Rest Framework 序列化器中的模型选择

python - DRF- Django Rest Framework re_path 查询参数 - "Method\"GET\"not allowed."

java - Rest webservice 生成客户端 stub

java - 使用java打印一系列素数的程序

java - 响应已经提交

java - 如何在 Java 中使用 Firebase REST API?

jakarta-ee - 从Grails生成的XML中将带有时间戳/日期的实体读取到Java POJO中