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

子资源方法上未调用Jersey名称绑定筛选器

冯祺
2023-03-14

使用带有@NamedBinding子资源方法的Jersey 2.25不会调用过滤器。

在下面的代码中,getData()方法触发AuthorizationFilter,但getSubDetails()方法没有触发。

@NameBinding
@Retention(RUNTIME)
@Target({ TYPE, METHOD })
public @interface Secured {
    Permission[] value() default {};
}


@Secured
@Provider
@Priority(Priorities.AUTHORIZATION)
public class AuthorizationFilter implements ContainerRequestFilter {
...
}

@Produces(MediaType.APPLICATION_JSON)
@Path("api/v1/jobs/{jobId}/document-sources")
@Secured(Permission.JOB_READER)
public class MyEndpoint {


    @Path("/{subId}")
    @GET
    @Secured(Permission.READ)
    public Class<?> getData(@PathParam("subId") String subId){
        return "data";
    }

    @Path("/{subId}/details")
    @Secured(Permission.READ)
    public Class<?> getSubDetails(@PathParam("subId") String subId){
        return SubDetails.class;
    }
}

JAX-RS文档(https://docs.oracle.com/javaee/7/api/javax/ws/rs/container/ContainerRequestFilter.html)似乎意味着过滤器应该处理子资源。

我做错什么了吗?名称绑定过滤器不再适用于子资源方法了吗?

共有1个答案

金高飞
2023-03-14

对于其他遇到这种情况的人来说:

子资源定位器方法没有针对它们运行的名称绑定过滤器(至少在泽西)。我找不到任何说明这是否正确的留档。

在我们的例子中,过滤器很重要,因为它向请求上下文添加对象,定位器方法使用这些对象来确定要返回的子资源。这些对象的创建有些昂贵(涉及数据库调用),因此我们不想只在子资源定位器方法中复制对象创建代码(加上这会违反DRY)。

我最后的解决方案是将对象创建逻辑移动到工厂中,并让工厂使用请求上下文缓存来确保它只做一次对象初始化。然后工厂被用于过滤器(用于授权)和子资源方法(用于确定发送哪个子资源)。然后每个子资源都必须有授权过滤器注释。

 类似资料:
  • 问题内容: 注释如何在Jersey中工作,以将过滤器应用于特定的资源方法或资源类? 考虑以下注释: 它是如何工作的? 问题答案: 名称绑定 名称绑定 是一个概念,它允许对JAX-RS运行时说,仅针对特定的资源方法才执行特定的过滤器或拦截器。当过滤器或拦截器仅限于特定资源方法时,我们说它是 名称绑定的 。没有这种限制的过滤器和拦截器称为 global 。 定义名称绑定注释 可以使用注释将过滤器或拦截

  • 我正在运行一个简单的maven项目(Maven3.3.9),其中包含配置文件和资源筛选。似乎总是在默认配置文件上进行筛选。 src/main/filters(默认)中有两个配置文件:config-dev.properties和config-prod.properties(仅包含一个变量application.env=development application.env=production 和s

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

  • 我正在使用Dropwizard 8.2.0构建REST服务。我有2个资源:FolderResource和FileResource: 我做错了什么?

  • 问题内容: 在Python中,有没有办法绑定未绑定的方法而不调用它? 我正在编写一个程序,对于某个类,我决定将所有按钮的数据分组为类级别的元组列表是一件好事,如下所示: 问题是,因为所有的值r都是未绑定方法,所以我的程序爆炸得很厉害,我哭了。 我正在网上寻找解决方案,该方案应该是一个相对直接,可解决的问题。不幸的是我找不到任何东西。现在,我正在解决此问题,但是没有人知道是否存在一种干净,健康,Py