Spring Security多过滤器链配置时Bean Order值莫名为空问题
Spring Security多过滤器链NPE问题排查
常见原因&解决办法
1. @Order注解用错地方了
- 得保证
@Order是加在整个过滤器链的配置类上,不是加在里面的方法或者Bean上。举个正确的例子:@Configuration @Order(1) // 直接标在配置类上,数值越小越先执行 public class JwtSecurityConfig { @Bean public SecurityFilterChain jwtFilterChain(HttpSecurity http) throws Exception { // 这里写JWT认证的配置逻辑 } } @Configuration @Order(2) public class ApiKeySecurityConfig { @Bean public SecurityFilterChain apiKeyFilterChain(HttpSecurity http) throws Exception { // 这里写API密钥认证的配置逻辑 } } - 别漏写
@Order的数值,必须给个整数,不能让它默认null。
2. 依赖版本不对
- 多过滤器链是Spring Security 5.4之后才正式支持的,要是你用的版本低于这个,肯定出问题。看看Spring Boot和Spring Security的版本匹配不,比如Spring Boot 2.4+对应Spring Security 5.4+,别搞版本冲突。
3. 配置类没被Spring扫到
- 检查下两个配置类的包路径是不是在
@SpringBootApplication的扫描范围内,要是不在,要么移包要么加@ComponentScan指定扫描路径。 - 别忘了给配置类加
@Configuration注解,不然Spring不认这个配置,@Order自然也失效了。
4. 过滤器顺序配置冲突
- 别瞎改
FilterOrderRegistration的默认配置,要是自己加了自定义过滤器,得给每个都明确指定order值,不能留空。 - 看看有没有第三方过滤器没指定order,和Spring Security的链顺序撞了。
5. 配置代码逻辑有问题
- 每个
SecurityFilterChain的配置得写完整,别在http.authorizeHttpRequests()这类方法里返回null配置。 - 检查JWT或者API密钥的过滤器Bean有没有正确初始化,别因为Bean本身NPE导致配置断了。
调试小技巧
- 开DEBUG日志看Spring Security加载过滤器链的过程,在application.properties里加:
logging.level.org.springframework.security=DEBUG - 给
FilterOrderRegistration.getOrder()打个断点,看看哪个过滤器的order是null,直接定位问题。
内容的提问来源于stack exchange,提问作者Dikianify
相关产品推荐
相关产品推荐

