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

单元测试使用MockMvc时自定义Spring filter chain未生效问题

Spring Boot自定义Filter未触发解决方案

以下是对应问题的排查修复步骤:

  • 未配置Filter拦截路径
    你的FilterRegistrationBean没有显式指定拦截的URL规则,默认不会匹配所有请求,需要补充配置:
@Bean
public FilterRegistrationBean<MyFilter> myFilter() {
    FilterRegistrationBean<MyFilter> regBean = new FilterRegistrationBean<>();
    regBean.setFilter(new MyFilter());
    regBean.setOrder(0);
    // 补充拦截路径配置,匹配所有请求可填"/*"
    regBean.addUrlPatterns("/*");
    return regBean;
}
  • 重复注册冲突
    MyFilter类已经加了@Component注解,Spring会自动将其注册为Filter,同时你在FilterRegistrationBean中又手动new了一个新的MyFilter实例,会出现同类型Filter的注册冲突,二选一保留一种注册方式即可:
    1. 删掉MyFilter类上的@Component注解,仅保留FilterRegistrationBean的手动注册逻辑,可灵活配置优先级和拦截规则
    2. 删掉WebConfig中的FilterRegistrationBean配置,在MyFilter类上添加@Order(0)和@WebFilter(urlPatterns = "/*")注解,同时在项目启动类上添加@ServletComponentScan注解扫描Filter相关注解
  • MockMvc测试未加载Filter
    默认MockMvc的webApplicationSetup模式下不会自动加载容器内的所有Filter,需要在构造MockMvc时显式添加:
@Autowired
private MyFilter myFilter;

@Before
public void before() {
    mockMvc = MockMvcBuilders.webApplicationSetup(ctx)
                // 手动添加自定义Filter
                .addFilter(myFilter, "/*")
                .build();
}
  • 请求路径不匹配
    如果已经配置了拦截路径,确认测试的接口路径符合配置的urlPatterns规则,例如配置为/api/*时,请求/test路径不会触发该Filter。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 15:15:02