一, 问题描述
自定义一个 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 对象中就可以使用相关的配置信息了
来源: http://www.bubuko.com/infodetail-3052169.html