Spring Boot中拦截RestController请求失效问题求助
解决Spring Boot拦截器未生效的问题
我帮你排查了下代码,发现拦截器没生效的核心原因是配置类没被Spring容器扫描到,还有几个小细节可以优化,具体方案如下:
1. 修复组件扫描范围,让配置类被加载
你的Application类的@SpringBootApplication只指定了扫描com.amazonaws.lambda.keefinty.controllers包,但配置类MyConfiguration在com.amazonaws.lambda.keefinty.application包,这个包不在扫描范围内,Spring根本没加载这个配置类,自然不会执行拦截器注册逻辑。
修改Application类的扫描范围,把根包包含进去:
package com.amazonaws.lambda.keefinty.application; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; @SpringBootApplication(scanBasePackages={"com.amazonaws.lambda.keefinty"}) public class Application extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(Application.class); } public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
或者更简洁:把Application类移到com.amazonaws.lambda.keefinty根包下,@SpringBootApplication默认会扫描当前包及其子包,就不用手动指定scanBasePackages了。
2. 替换过时的WebMvcConfigurerAdapter
从Spring 5开始,WebMvcConfigurerAdapter已经被废弃,推荐直接实现WebMvcConfigurer接口(接口方法都是默认方法,无需全部实现):
package com.amazonaws.lambda.keefinty.application; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import com.amazonaws.lambda.keefinty.interceptors.MyInterceptor; @Configuration public class MyConfiguration implements WebMvcConfigurer { @Bean public MyInterceptor getInterceptor() { return new MyInterceptor(); } @Override public void addInterceptors(InterceptorRegistry registry) { System.out.println("\n\nAdding interceptors\n\n"); registry.addInterceptor(getInterceptor()).addPathPatterns("/**"); } }
3. 优化拦截器的Bean注册方式
你的MyInterceptor已经加了@Component注解,Spring会自动创建这个Bean,所以配置类里的@Bean可以去掉,改用构造注入,避免重复创建Bean:
package com.amazonaws.lambda.keefinty.application; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import com.amazonaws.lambda.keefinty.interceptors.MyInterceptor; @Configuration public class MyConfiguration implements WebMvcConfigurer { private final MyInterceptor myInterceptor; // 构造注入拦截器Bean public MyConfiguration(MyInterceptor myInterceptor) { this.myInterceptor = myInterceptor; } @Override public void addInterceptors(InterceptorRegistry registry) { System.out.println("\n\nAdding interceptors\n\n"); registry.addInterceptor(myInterceptor).addPathPatterns("/**"); } }
如果你更倾向于用@Bean创建拦截器,那可以去掉MyInterceptor上的@Component注解,二选一即可。
验证步骤
修改完成后启动应用:
- 观察控制台是否打印
Adding interceptors,如果打印了说明配置类已被加载; - 发送请求(带/不带token),检查是否触发
MyInterceptor里的preHandle逻辑,比如控制台打印In MyInterceptor.preHandle,或者不带token时抛出预期的异常。
内容的提问来源于stack exchange,提问作者user6495105
相关产品推荐
相关产品推荐

