这个SecurityProperties为什么不需要@Autowired注入,导致启动空指针报错。
来源:4-8 图片验证码重构

Fidel_Yiu
2020-12-05
视频在11:26处
在后面afterPropertiesSet()方法中又去执行了securityProperties的get方法,但是它在启动的时候始终是null,然后调用get方法就报空指针的错误,最后我手动去获取了这个Bean之后给这个securityProperties赋值才执行通过了。
但是我有点担心,
- 这个afterPropertiesSet()是手动在SecurityConfig中执行的,它会是所有Bean都初始化完后执行么(如果不是,那是不是手动获取Bean的操作也会获取到null)
- 如果不手动获取,还有其他什么方式给这个SecurityProperties赋值。
- 还是说视频中的这种方式在现在版本的Spring中不能使用了。
下面是我的代码
@Getter
@Setter
public class ValidateCodeFilter
extends OncePerRequestFilter
implements InitializingBean {
// 注意这里没有注入,是使用 Get & Set 方法写入该对象的
private AuthenticationFailureHandler authenticationFailureHandler;
private Set<String> urls = new HashSet<>();
// 这里真的可以获取到值么
private SecurityProperties securityProperties;
private AntPathMatcher pathMatcher = new AntPathMatcher();
@Override
public void afterPropertiesSet() throws ServletException {
super.afterPropertiesSet();
// 注释的地方是我手动获取的Bean
// securityProperties = SpringUtil.getBean(SecurityProperties.class);
String[] configUrls = StringUtils.splitByWholeSeparatorPreserveAllTokens(securityProperties.getCode().getImage().getUrl(), ",");
urls.addAll(Arrays.asList(configUrls));
urls.add("/login/form");
}
// ...
}
写回答
2回答
-
慕容4009360
2020-12-25
重构前 validateCodeFilter 只是用于图片验证码校验,在配置这个过滤器时通过 setter 赋值的;
ValidateCodeFilter validateCodeFilter = new ValidateCodeFilter(); validateCodeFilter.setAuthenticationFailureHandler(imoocAuthenticationFailureHandler); validateCodeFilter.setSecurityProperties(securityProperties); validateCodeFilter.afterPropertiesSet();
重构后 validateCodeFilter 直接做为一个 @Bean 加入到容器中,根据入口的类型(sms/image) 的不同
来获取相应的 processor , 相当于重用了; securityProperties 也是也是一个配置 @Bean 所以直接添加注解 @Autowired 注入就可以了;00 -
慕容4009360
2020-12-25
重构前 validateCodeFilter 只是用于图片验证码校验,在配置这个过滤器时通过 setter 赋值的; ValidateCodeFilter validateCodeFilter = new ValidateCodeFilter(); validateCodeFilter.setAuthenticationFailureHandler(imoocAuthenticationFailureHandler); validateCodeFilter.setSecurityProperties(securityProperties); validateCodeFilter.afterPropertiesSet(); 重构后 validateCodeFilter 直接做为一个 @Bean 加入到容器中,根据入口的类型(sms/image) 的不同 来获取相应的 processor , 相当于重用了; securityProperties 也是也是一个配置 @Bean 所以直接添加注解 @Autowired 注入就可以了;
00
Spring Security技术栈开发企业级认证与授权
Spring Security技术栈,REST风格开发常见接口,独立开发认证授权模块保证REST服务安全
2662 学习 · 1561 问题
相似问题