一、问题描述
自定义一个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对象中就可以使用相关的配置信息了
本文介绍了一种在Spring框架中正确配置自定义Filter的方法,解决了因执行顺序导致的配置值未注入的问题。通过创建专门的配置类并在构造Filter时传递配置信息,确保了Filter能够正常使用所需的配置。
3224

被折叠的 条评论
为什么被折叠?



