Spring Security过滤器使用@Autowired注入Bean触发NullPointerException问题
空指针异常触发原因
异常堆栈明确指向空指针发生在SimpleApplicationSettingManager的isConfigValue方法内,结合代码逻辑,概率从高到低有两类触发原因:
- 查询结果为空:
applicationSettingsDao.getSettingsByKey(Constants.CONFIG_VALUE)执行时,数据库中不存在对应CONFIG_VALUE的配置记录,方法返回null,后续直接调用getValue()触发空指针。 - Dao注入失败:
SimpleApplicationSettingManager中的ApplicationSettingsDao没有被Spring成功注入,调用getSettingsByKey时触发空指针,这种情况通常是组件扫描配置错误导致@Service、@Autowired注解未生效。
解决方案
针对查询结果为空的修复(优先处理)
修改isConfigValue方法的逻辑,增加空值校验,避免无意义的链式调用,同时确认数据库中存在对应配置:
@Override public boolean isConfigValue() { ApplicationSettings settings = applicationSettingsDao.getSettingsByKey(Constants.CONFIG_VALUE); // 空值直接返回false,也可以根据业务需求返回对应默认值 return settings != null && "true".equalsIgnoreCase(settings.getValue()); }
同时检查配置表中是否存在CONFIG_VALUE对应的记录,不存在则新增符合业务要求的默认值。
针对Dao注入失败的修复
- 确认
SimpleApplicationSettingManager所在的包路径已经被加入Spring的组件扫描范围,保证@Service注解可以被Spring识别。 - 补充检查自定义过滤器的托管逻辑:如果你的
AuthenticationProcessingFilter是手动new出来注册到Spring Security配置中的,过滤器本身不受Spring管理会导致内部@Autowired失效(当前堆栈中已经进入了Service方法逻辑,说明本次问题不属于这类,但后续改造建议按以下方式配置,避免注入异常):- 给过滤器增加
@Component注解交给Spring托管 - Security配置中直接注入过滤器实例,不要手动创建:
@Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private AuthenticationProcessingFilter authenticationProcessingFilter; @Override protected void configure(HttpSecurity http) throws Exception { http.addFilterAt(authenticationProcessingFilter, UsernamePasswordAuthenticationFilter.class); // 其余安全配置 } } - 给过滤器增加
内容的提问来源于stack exchange,提问作者Anand
相关产品推荐
相关产品推荐

