添加自定义过滤器后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
相关产品推荐
相关产品推荐

