我有一个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”吗?
答案 0 :(得分:0)
如果要使用@PreMatching
,请从过滤器中移除ResourceInfo
注释。来自@PreMatching
文档:
在将传入请求与特定资源方法匹配之前,JAX-RS运行时将全局应用标记有
@PreMatching
注释的过滤器。 [...]
如果请求尚未与任何资源方法匹配,则此信息不可用。