Java Spring拦截器不适用于部分REST端点

Java Spring拦截器不适用于部分REST端点,java,rest,spring-mvc,interceptor,Java,Rest,Spring Mvc,Interceptor,我有一个Spring引导应用程序,REST端点定义如下 /usermanagement/v1/access/ldap /usermanagement/v1/access/db 我创建了一个Spring拦截器,用以下模式截获所有传入的请求 @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new RequestInterceptor()).addPath

我有一个Spring引导应用程序,REST端点定义如下

/usermanagement/v1/access/ldap
/usermanagement/v1/access/db
我创建了一个Spring拦截器,用以下模式截获所有传入的请求

@Override
public void addInterceptors(InterceptorRegistry registry) {
   registry.addInterceptor(new RequestInterceptor()).addPathPatterns("/usermanagement/v1/**");
}
请求拦截器

@Component
public class RequestInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
        throws Exception {
        return true;
    }

    @Override
    public void postHandle(
        HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
        throws Exception {
        System.out.println("This is Post Handling the request");
    }
}
只有当客户端访问完整的端点(即

/用户管理/v1/access/ldap

如果访问了部分端点

/用户管理/v1/access

不会调用拦截器,并将404返回给客户端


有没有办法改变这种行为?我这样做的原因是,我不想公开特定的端点,而是公开公共端点,对服务进行内部调用,并通过公共端点返回结果。

您使用了错误的方法。尝试使用
afterCompletion
而不是
postHandle

new HandlerInterceptor() {

        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //This is called before handeling any request
        }

        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        //This is called after successfully handeling a request. It will not be called in case of an exception
        }

        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        //This will always be called after a request, even in case of an exception
        }
}

对未定义端点的请求
/usermanagement/v1/access
Spring将引发异常。因此,它永远不会进入
postHandle

您是否在
/usermanagement/v1/access
上定义了任何资源访问权限?@HerrDerb不,我没有,但因为它与要拦截的模式匹配,应该调用拦截器。您在
请求拦截器中执行
预处理
还是
后处理
?使用
/usermanagement/v1/access
返回什么?ldap还是数据库资源?我觉得您根本不需要拦截器。@HerrDerb是的,我的拦截器中有它们的空实现。我使用
/usermanagement/v1/access
作为公共端点。之后,请求将被解析并在内部转发到相应的服务,具体取决于请求头和请求体中的值。因此,请求将转发到未定义的
/usermanagement/v1/access
,Spring将为您提供一个
404
,这是正确的。还是我误解了什么?您可以添加处理程序的源吗?可能不会调用任何方法。你在你那边试过这个吗?我只是在找这个。谢谢:)