Meena Chaudhary
Meena Chaudhary

Reputation: 10715

Spring interceptor not working for partial REST endpoints

I have a Spring Boot application with REST endpoints defined like this

/usermanagement/v1/access/ldap
/usermanagement/v1/access/db

I have created a Spring Interceptor to intercept all incoming request with following pattern

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

RequestInterceptor

@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");
    }
}

This interceptor works only if client accesses the complete endpoint i.e

/usermanagement/v1/access/ldap

In case a partial endpoint is accessed,

/usermanagement/v1/access

interceptor is not called and a 404 is returned to the client.

Is there a way to change this behavior? The reason I am doing this is because I don't want to expose specific endpoints but common endpoints and make internal calls to services and return result through common endpoints.

Upvotes: 1

Views: 2207

Answers (1)

Herr Derb
Herr Derb

Reputation: 5387

You are using the wrong method. Try using afterCompletion instead of 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
        }
}

With a request to a undefined endpoint /usermanagement/v1/access Spring will throw an exception. Therefor it never will enter postHandle.

Upvotes: 2

Related Questions