Spring拦截器中注入Bean失败解放方案详解
...大约 1 分钟
Spring拦截器中注入Bean失败解放方案详解
1、场景
LoginUserInfoInterceptor
拦截器中需要用@Autowired
注入JwtProperties
类,结果发现注入的JwtProperties
为Null
。
2、原因
拦截器的配置类是以new JwtInterceptor
的方式使用的,那么这个LoginUserInfoInterceptor
不受Spring
管理。因此,里边@Autowired
注入JwtProperties
是不会注入进去的。
3、问题重现
yml
jwt:
white-list-url:
- ${server.servlet.context-path}
拦截器配置
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
/**
* <h2>添加拦截器配置</h2>
*/
@Override
protected void addInterceptors(InterceptorRegistry registry) {
// 添加用户身份统一登录拦截的拦截器
registry.addInterceptor(new LoginUserInfoInterceptor())
// 拦截的路径
.addPathPatterns("/**")
// 拦截器执行顺序,数字越小,优先级越高
.order(0);
}
......
}
拦截器
@Slf4j
@Component
@SuppressWarnings("all")
public class LoginUserInfoInterceptor implements HandlerInterceptor {
@Autowired
private JwtProperties jwtProperties;
......
}
JwtProperties
@Data
@Component
@ConfigurationProperties(prefix = "jwt")
public class JwtProperties {
private List<String> whiteListUrl;
public List<String> getWhiteListUrl() {
whiteListUrl.addAll(List.of("springfox", "swagger", "v2", "webjars", "doc.html"));
return whiteListUrl;
}
}
测试访问报错
java.lang.NullPointerException: null
4、解决方案
配置类中将new LoginUserInfoInterceptor()
改为Bean
的方式
@Override
protected void addInterceptors(InterceptorRegistry registry) {
// 添加用户身份统一登录拦截的拦截器
registry.addInterceptor(getLoginUserInfoInterceptor())
// 拦截的路径
.addPathPatterns("/**")
// 拦截器执行顺序,数字越小,优先级越高
.order(0);
}
@Bean
public LoginUserInfoInterceptor getLoginUserInfoInterceptor(){
return new LoginUserInfoInterceptor();
}
拦截器(此时无需@Component)
@Slf4j
//@Component
@SuppressWarnings("all")
public class LoginUserInfoInterceptor implements HandlerInterceptor {
@Autowired
private JwtProperties jwtProperties;
......
}
你认为这篇文章怎么样?
- 0
- 0
- 0
- 0
- 0
- 0