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

添加自定义过滤器后Spring Boot启动时GenericFilterBean空指针异常求助

自定义过滤器启动NPE问题解决方案

问题根因

这个空指针异常是因为自定义过滤器没有被Spring容器正确管理,导致GenericFilterBean中的logger字段未完成初始化,调用init()方法时触发空指针。

解决步骤

  • 让Spring托管过滤器实例
    禁止手动new自定义过滤器对象,必须通过Spring的bean管理机制创建实例:

    • 方案一:给过滤器类添加@Component注解,让Spring自动扫描并托管
      @Component
      public class CustomFilter extends OncePerRequestFilter {
          @Override
          protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
              // 你的过滤器逻辑
          }
      }
      
    • 方案二:在配置类中通过@Bean方法注册过滤器
      @Configuration
      public class FilterConfig {
          @Bean
          public CustomFilter customFilter() {
              return new CustomFilter();
          }
      
          @Bean
          public FilterRegistrationBean<CustomFilter> customFilterRegistration(CustomFilter customFilter) {
              FilterRegistrationBean<CustomFilter> registration = new FilterRegistrationBean<>();
              registration.setFilter(customFilter);
              registration.addUrlPatterns("/*"); // 按需配置拦截路径
              return registration;
          }
      }
      

    核心是必须让Spring负责过滤器的实例化,它会自动完成logger等字段的注入。

  • 重写init方法必须调用父类逻辑
    如果你的过滤器重写了init()方法,一定要调用super.init(filterConfig),否则父类GenericFilterBean的初始化逻辑不会执行,logger会保持为null:

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 你的自定义初始化代码
        super.init(filterConfig); // 这行必须加
    }
    
  • 禁止手动调用init方法
    不要在业务代码中手动调用过滤器的init()方法,Spring会在容器启动阶段自动执行该方法完成初始化。

验证要点

启动前确认:过滤器实例由Spring创建(比如通过@Autowired注入到配置类)、重写init方法时已调用父类方法、没有手动实例化过滤器的代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 17:55:21