当前位置: 首页 > 知识库问答 >
问题:

在泽西岛使用名称绑定注释

轩辕煜
2023-03-14

@namebinding注释如何在Jersey中工作,以便对特定的资源方法或资源类应用筛选器?

请考虑以下注释:

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

它是如何工作的?

共有1个答案

慕飞章
2023-03-14

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

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

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

上面的示例定义了一个新的@compress注释,它是一个名称绑定注释,因为它是用@namebinding注释的。@compress注释可用于将筛选器和拦截器绑定到endpoint。

假设您有一个执行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()方法执行。将不对gethello()方法执行拦截器。在这个例子中,原因可能很清楚。我们希望只压缩长数据,而不需要压缩“Hello World!”的短响应。

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

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

  • @namebinding注释文档
  • 关于筛选器和拦截器的泽西岛文档
  • 使用筛选器和名称绑定注释记录HTTP请求和响应
  • 使用筛选器和名称绑定注释的基于令牌的身份验证
  • 使用拦截器和名称绑定注释向带有Jackson的JSON添加属性
  • 出于安全目的使用名称绑定的筛选器
 类似资料:
  • 我目前使用的是球衣 我现在要做的是设置泽西,这样当查询参数进来时(比如缩进),我可以告诉Jackson以“更漂亮的格式,也就是缩进”序列化JSON。您可以通过使用SerializationConfig.Feature.INDENT_OUTPUT配置JSON映射器来轻松地告诉Jackson这样做。 问题是,我如何在每个请求的基础上获取一个queryparam并使用它来修改Jackson的输出?

  • 我正在编写一个公开 REST API 的简单微服务。所以我开始使用泽西岛,当然我需要将我的对象注入球衣资源中。基本上,我有2个类来定义一组资源,其中一些需要使用另一个服务。 所以基本上我有: } 该接口的2种实现(MyServiceBean和My备选ServiceBean) 而且,就我对阅读新泽西文件的理解,我定义了一个hk2活页夹: 我将此活页夹注册到ApplicationConfig类 } 并

  • 我正在学习并尝试构建一个rest api。但是我很难理解各种绑定之间的区别-、、以及范围-、和。它们之间有什么区别以及何时使用哪一个? e、 g.假设我有一些特定于请求的数据传入请求头。我想在请求处理期间多次使用此数据(比如在资源类、DAO等中)。我想到的是,我将使用,并使用 ContainerRequestContext提取数据,然后将其存储到某个类中。但我无法确定如何绑定这个类,以便以后可以访

  • 在我的应用程序中,我需要根据用户输入获得不同的实现。 到目前为止,我所做的只是通过在启动时使用和绑定到实现的接口注入服务: 然而,现在我需要根据用户输入动态获取一个实现。有25种不同的实现都使用相同的接口。 这意味着,我不能再简单地使用方法。相反,我认为我需要用单独注册它们。 我需要来自HK2的实例,因为Impl也使用注入的服务,所以我不能简单地创建一个新的实例。

  • 我决定在这部分替换Web.XML: 我指向servlet容器Jersey,它将接受对REST-Controllers的请求,表明在启动时有必要扫描路径com . skillsimprover . REST examples . REST上的包REST,并表明资源的所有方法和类的基URI都填充了/api/* 从 JAX-RS 2.x 版本开始,可以使用应用程序类或资源配置类来注册包和资源。 我执行了

  • 我试图将资源的实例注入具有Singleton作用域的JAX-RS应用程序,但当我这样做时,我得到: 警告:在服务器运行时中注册的提供程序com.test.jersey.app.MyResource未实现任何适用于服务器运行时的提供程序接口。由于约束配置问题,将忽略提供程序com.test.jersey.app.MyResource。 我有一个如下的应用程序,它需要一个已经运行的MyResource