spring-data-rest icon indicating copy to clipboard operation
spring-data-rest copied to clipboard

Interceptor not working in Spring Data REST URLs [DATAREST-1155]

Open spring-projects-issues opened this issue 8 years ago • 2 comments

Andre Rocha opened DATAREST-1155 and commented

I am working on a project with Spring Data Rest and JPA and I am trying to configure an HTTP interceptor to configure switch the tenant depending on the HTTP request header. As per the reference docs, available in Spring Web MVC Docs - Handler Mapping Interceptor, I created a component that extends HandlerInterceptorAdapter as follows:

@Component public class DBEditorTenantInterceptor extends HandlerInterceptorAdapter {

Logger logger = LoggerFactory.getLogger(DBEditorTenantInterceptor.class);

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
    throws Exception {
     logger.debug("********** INTERCEPTION SUCCESSFUL **********");
     return true;
}

} And then, registered the interceptor by extending WebMvcConfig (as explained in Spring Web MVC Docs - Config Interceptors

@Configuration public class WebMvcConfig extends WebMvcConfigurerAdapter {

@Autowired
DBEditorTenantInterceptor dbEditorTenantInterceptor;

@Override
public void addInterceptors(InterceptorRegistry registry) {
     registry.addInterceptor(dbEditorTenantInterceptor)
     .addPathPatterns("/**");
}

} When I issue HTTP requests to any URL that is not used by Spring Data REST such as /helloworld the Interceptor works as expected, as I see the logger output

017-10-26 13:16:24.689 DEBUG 17012 --- [p-nio-80-exec-4] c.c.v.d.DBEditorTenantInterceptor : ********** INTERCEPTION SUCCESSFUL ********** However, when the URL is used by spring data rest, my interceptor is not called. This applies to all URLs like /api/{existing entity in model}

Why is my interceptor not called for Spring Data Rest URLs ? What can I do to make my interceptor work for all requests ?

Thanks a lot in advance.

PS: this question is also on stackoverflow in https://stackoverflow.com/questions/46953039/spring-interceptor-not-working-in-spring-data-rest-urls


No further details from DATAREST-1155

spring-projects-issues avatar Oct 26 '17 15:10 spring-projects-issues

Just encountered this same issue. Is this expected behaviour of Spring Data Rest?

peter-janssen avatar Mar 22 '24 09:03 peter-janssen

Took me a while but I understand now. Spring Data REST uses its own RepositoryRestDispatcherServlet. Which only knows about the RepositoryRestHandlerMapping. Which, like every HandlerMapping, picks up MappedInterceptors. That's why the solution presented on Stack Overflow works:

@Bean
public MappedInterceptor someMethodName() {
    return new MappedInterceptor(
        null,  // => maps to any repository
        new YourInterceptorImpl()
    );
}

Spring MVC has a the InterceptorRegistry to register interceptors to four HandlerMappers used by the "regular" DispatcherServlet. So Spring Data REST never considers Interceptors from the InterceptorRegistry. I suppose this is an architectural decision since it has its own MVC implementation.

However, when trying to apply interceptors to all requests using both Spring Data REST and regular Spring MVC controllers it would require to only use the MappedInterceptors. This is somewhat unfortunate since the InterceptorRegistration provides some fine grained control over the order of Interceptors.

peter-janssen avatar Mar 22 '24 21:03 peter-janssen