这个SecurityProperties为什么不需要@Autowired注入,导致启动空指针报错。

来源:4-8 图片验证码重构

Fidel_Yiu

2020-12-05

图片描述

视频在11:26处

在后面afterPropertiesSet()方法中又去执行了securityProperties的get方法,但是它在启动的时候始终是null,然后调用get方法就报空指针的错误,最后我手动去获取了这个Bean之后给这个securityProperties赋值才执行通过了。

但是我有点担心,

  1. 这个afterPropertiesSet()是手动在SecurityConfig中执行的,它会是所有Bean都初始化完后执行么(如果不是,那是不是手动获取Bean的操作也会获取到null)
  2. 如果不手动获取,还有其他什么方式给这个SecurityProperties赋值。
  3. 还是说视频中的这种方式在现在版本的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 注入就可以了;

0
0

慕容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 注入就可以了;
0
0

Spring Security技术栈开发企业级认证与授权

Spring Security技术栈,REST风格开发常见接口,独立开发认证授权模块保证REST服务安全

2662 学习 · 1561 问题

查看课程