首页 > 解决方案 > 以编程方式调用 Jersey ResourceMethod

问题描述

我需要在每个 ResourceMethod 调用之前/之后拦截 Jersey 资源调用并运行代码。我有一个 ModelProcessor 并且能够拦截呼叫:

for(Resource resource: resourceModel.getResources()) {
    for (ResourceMethod resourceMethod : resource.getResourceMethods()) {
        Resource.Builder resourceBuilder = Resource.builder(...);

        resourceBuilder
        .addMethod(resourceMethod)
        .handledBy(new Inflector<ContainerRequestContext, Response>() {
          @Override
          public Response apply(ContainerRequestContext containerRequestContext) {
              ...
          }
        });
    }
}

但是,我不知道如何在这里调用原始的 ResourceMethod。

标签: jersey

解决方案


您可以考虑使用 Jersey 过滤器或拦截器。从文档: https ://eclipse-ee4j.github.io/jersey.github.io/documentation/latest/filters-and-interceptors.html#d0e9368

过滤器和拦截器可以在客户端和服务器端使用。过滤器可以修改入站和出站请求和响应,包括修改标头、实体和其他请求/响应参数。拦截器主要用于修改实体输入和输出流。例如,您可以使用拦截器来压缩和解压缩输出和输入实体流。

拦截器为服务器端和客户端共享一个公共 API。过滤器主要用于操纵请求和响应参数,如 HTTP 标头、URI 和/或 HTTP 方法,而拦截器旨在通过操纵实体输入/输出流来操纵实体。例如,如果您需要对客户端请求的实体主体进行编码,那么您可以实现一个拦截器来为您完成工作。

所以我认为你想使用拦截器,因为它们会包装资源调用,并且你可以在资源调用之前和资源调用之后访问相同的方法。

您也可以使用过滤器,但您必须将代码分解为 RequestFilter 和 ResponseFilter。


推荐阅读