一、問題描述
自定義一個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對象中就可以使用相關的配置信息了