当前位置: 首页 > 面试题库 >

在Jersey中使用名称绑定注释

谭京
2023-03-14
问题内容

@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 注释文档
  • 泽西岛有关过滤器和拦截器的文档


 类似资料:
  • 注释如何在Jersey中工作,以便对特定的资源方法或资源类应用筛选器? 请考虑以下注释: 它是如何工作的?

  • 使用带有@NamedBinding子资源方法的Jersey 2.25不会调用过滤器。 在下面的代码中,getData()方法触发AuthorizationFilter,但getSubDetails()方法没有触发。 JAX-RS文档(https://docs.oracle.com/javaee/7/api/javax/ws/rs/container/ContainerRequestFilter.h

  • 问题内容: 我目前正在创建一个有趣的python线性代数模块,并使用该语言进行实践。我最近尝试将类型注释添加到模块中,如下所示: 但是,当我尝试导入它时,它吐出一个。我承认这个问题已经在这里以某种形式得到了回答,但似乎并不能完全解决我的情况。 我想知道的是: 我已经在该文件中按字面值定义了该类。为什么说未定义名称? 如何定义可用于注释的方式(作为)? 问题答案: 您有一份前瞻性声明;函数(作为方法

  • 我对一个问题感到沮丧,我花了几个小时试图解决它!问题是。我试图查找一个已经在我的jboss服务器中声明的主题(MyBestTopic ),但是我有这个异常 在我的java代码中,我试图像这样检索主题: 查看jboss server的启动,我可以看到主题与正确的名称绑定得很好: 最后,当我在jmx控制台上看到jndiView树时,该主题也得到了很好的部署: 相同的java在具有相同部署主题和数据源的

  • 我刚刚发现了一种我无法理解的Spring的行为。我使用的是Spring Boot 1.5。十、 在一个配置类中,我声明了两个不同的bean。 然后,我有一个类,它应该使用名为的bean。 因为我指定了我想要使用注释注入的bean的名称,所以我希望Spring注入名为的bean。但是,在注入过程中实际上使用了名为的bean。 事实证明,问题在于在配置类中声明bean的方法的名称。两者都是colled

  • 问题内容: 我在HQL语句中绑定了命名参数,但只是没有被填充。 它输出类似这样的内容,这意味着未设置参数(coln,colv)并返回0条记录。 感谢您提供有关如何在HQL语句中绑定列名称的任何帮助。谢谢。马赫迪。 问题答案: 您不能将列名称绑定为参数。仅一列值。在绑定参数值和执行查询之前,在计算执行计划时必须知道该名称。如果您确实希望拥有这样的动态查询,请使用Criteria API或其他动态创建