@Value()读取配置文件属性,读出值为null的问题

一、问题描述

自定义一个Filter如下:

@Component
public class JwtFilter extends GenericFilterBean{
 
    @Value("${jwt.header}")
    private String header;  //此处无法注入 值为 null
在config中将此filter注册给spring

@Configuration
@AutoConfigureAfter(JwtFilter.class)
public class JwtConfig {
    @Bean
    public FilterRegistrationBean jwtFilter() {
        final FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(new JwtFilter());  //率先执行
        String[] paths = jwtProperty.getCheckPath().split(",");
        for (String p : paths){
            registrationBean.addUrlPatterns(p);
            System.out.println(p);
        }
        return registrationBean;
    }
}

原因:执行顺序问题,config率先执行,new JwtFilter()会构造一个filter对象交给spring,而此时 @Value还未读取配置,所以在JwtFilter中的 @Value值为 null。

解决方法: 使用一个类来读取配置

@Component
@Data
public class JwtProperty {
 
    @Value("${jwt.header}")
    private String header;
 
    @Value("${jwt.tokenHead}")
    private String tokenHead;
 
    @Value("${jwt.secret}")
    private String secret;
 
    @Value("${jwt.checkPath}")
    private String checkPath;
 
    @Value("${jwt.expiration}")
    private Integer expire;
 
    public JwtProperty() {
    }
}

然后将其注入到config中

@Configuration
public class JwtConfig {
 
 
    @Autowired
    private JwtProperty jwtProperty;

在 构造JwtFilter时,作为参数传入构造函数

new JwtFilter(jwtProperty)
则,在 JwtFilter对象中就可以使用相关的配置信息了

posted @ 2019-05-09 09:04  a-du  阅读(3121)  评论(0编辑  收藏  举报