Spring拦截器与@RepositoryRestResource端点不生效适配问题
问题根因
- Spring Data REST 托管的
@RepositoryRestResource端点,使用独立的RepositoryRestHandlerMapping实现完成请求匹配,该组件不属于Spring MVC默认的RequestMappingHandlerMapping体系。 - 在常规
WebMvcConfigurer#addInterceptors方法中注册的拦截器,默认只会挂载到Spring MVC默认的请求映射处理器上,不会自动注入到Spring Data REST的专属处理链路中,因此拦截逻辑不会被触发。 - 当接口替换为
@RestController定义时,请求会走默认的RequestMappingHandlerMapping处理流程,自然能被已注册的拦截器捕获。
落地配置方案
前置代码优化
- 避免手动创建拦截器实例:将
TestInterceptor作为Spring托管Bean,通过构造器注入到配置类中,不要使用new TestInterceptor()的方式创建游离实例,保证拦截器可以正常使用Spring容器提供的依赖注入能力。 - 确认Spring Data REST的基础路径与拦截器的匹配规则一致:通过配置
spring.data.rest.base-path=/api,明确Spring Data REST端点的统一前缀,避免出现路径规则不匹配的问题。
拦截器双链路挂载
拦截器需要同时覆盖常规MVC接口、Spring Data REST专属接口的处理链路,对应配置类参考实现如下:
@SpringBootConfiguration public class AnnotationSecurityConfiguration implements WebMvcConfigurer { // 注入容器内托管的拦截器实例 private final TestInterceptor testInterceptor; // 构造器注入,避免手动创建游离实例 public AnnotationSecurityConfiguration(TestInterceptor testInterceptor) { this.testInterceptor = testInterceptor; } @Override public void addInterceptors(InterceptorRegistry registry) { // 统一注册拦截器,匹配所有/api下的请求路径 registry.addInterceptor(testInterceptor) .addPathPatterns("/api/**") .order(0); // 保证拦截器优先级优先于其他处理器 } }
- 当项目使用Spring Boot 2.6+、Spring Data REST 3.6+版本时,上述配置即可自动对Spring Data REST端点生效,因为版本迭代后Spring Data REST会自动接入全局注册的MVC拦截器。
- 低版本Spring Boot / Spring Data REST场景下,可额外实现
RepositoryRestConfigurer接口,将同一个拦截器实例手动注册到Spring Data REST的专属处理链路中,确保拦截逻辑可以被触发。 - 如果不需要区分不同接口的拦截规则,也可以使用Servlet层的
Filter实现全局请求拦截,该方式对所有进入DispatcherServlet的请求生效,不受HandlerMapping实现类的差异影响。
内容的提问来源于stack exchange,提问作者erotsppa
相关产品推荐
相关产品推荐

