从JAX-RS ContainerRequestFilter&中提取资源方法名称。 ContainerResponseFilter

时间:2018-06-14 10:55:53

标签: jax-rs

我有一个Filter类

    @Provider
    @PreMatching
    @Priority(1700)
    A_authenticationFilter implements ContainerRequestFilter 
    {
    try {
            // Logic
            }
    catch {
        throw Exception
    }
    }

另一个过滤类

    @Provider
    @PreMatching
    @Priority(5000)
    B_authenticationFilter implements ContainerRequestFilter,ContainerResponseFilter {

    @Context
    ResourceInfo resourceInfo;

    @Override
    public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) { }

    @Override
    public void filter(ContainerRequestContext requestContext { }


    }

一个Controller类 // JAX-RS控制器

    @Path
    TokenServicesImpl {

    @POST
    @Path
    public Response login() {
    }

    }

当我想调用Controller类的登录时,它会通过1st A_authenticationFilter并且由于标头中的某些验证错误而失败,因此登录方法不会被执行, resourceInfo.getResourceMethod()在B_authenticationFilter的过滤器(ContainerRequestContext requestContext,ContainerResponseContext responseContext)中解析为null。

我想只有在执行控制器方法时才会填充resourceInfo。如果没有执行login方法,那么还有其他任何方法,我可以使用资源方法名称填充resourceInfo对象,即其中的“login”吗?

1 个答案:

答案 0 :(得分:0)

如果要使用@PreMatching,请从过滤器中移除ResourceInfo注释。来自@PreMatching文档:

  

在将传入请求与特定资源方法匹配之前,JAX-RS运行时将全局应用标记有@PreMatching注释的过滤器。 [...]

如果请求尚未与任何资源方法匹配,则此信息不可用。