You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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注解,二选一即可。

验证步骤

修改完成后启动应用:

  1. 观察控制台是否打印Adding interceptors,如果打印了说明配置类已被加载;
  2. 发送请求(带/不带token),检查是否触发MyInterceptor里的preHandle逻辑,比如控制台打印In MyInterceptor.preHandle,或者不带token时抛出预期的异常。

内容的提问来源于stack exchange,提问作者user6495105

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:04:03