在子资源方法上没有调用Jersey NameBinding过滤器

时间:2018-04-26 01:25:34

标签: java jersey

使用带有@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)似乎暗示过滤器应该处理子资源。

我做错了吗? NameBinding过滤器不再适用于子资源方法吗?

1 个答案:

答案 0 :(得分:0)

对于遇到此问题的其他人:

子资源定位器方法没有针对它们运行NameBinding过滤器(至少在Jersey中)。我找不到任何文件说明这是否正确。

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

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

相关问题