一、问题描述
自定义一个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对象中就可以使用相关的配置信息了