Java 扩展GenericFilterBean的筛选器中的Autowired字段为空
我正在尝试自动将服务连接到我的请求筛选器。它给了我一个空指针异常,我不太清楚为什么。我在我的控制器中使用了完全相同的autowire类,它可以正常工作Java 扩展GenericFilterBean的筛选器中的Autowired字段为空,java,spring,spring-boot,spring-bean,Java,Spring,Spring Boot,Spring Bean,我正在尝试自动将服务连接到我的请求筛选器。它给了我一个空指针异常,我不太清楚为什么。我在我的控制器中使用了完全相同的autowire类,它可以正常工作 @Component(value="jwtFilter") public class JwtFilter extends GenericFilterBean { RedisClient redisClient = new RedisClient(); @Autowired JwtTokenService jwtServ;
@Component(value="jwtFilter")
public class JwtFilter extends GenericFilterBean {
RedisClient redisClient = new RedisClient();
@Autowired
JwtTokenService jwtServ; // Is null for some reason??!!
@Override
public void doFilter(final ServletRequest req,
final ServletResponse res,
final FilterChain chain) throws IOException, ServletException {
// SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this); // Doesnt fix issue
System.out.println("\nMaking request...");
final HttpServletRequest request = (HttpServletRequest) req;
final String authHeader = request.getHeader("Authorization");
if (authHeader == null || !authHeader.startsWith("Bearer ")) {
throw new ServletException("Missing or invalid Authorization header.");
}
final String token = authHeader.substring(7); // The part after "Bearer "
try {
final Claims claims = Jwts.parser().setSigningKey("${userapi.secret}")
.parseClaimsJws(token).getBody();
request.setAttribute("claims", claims);
request.setAttribute("token", token);
System.out.println(claims.getSubject() + " <~~ Subject from jwt");
JwtToken foundT = jwtServ.findByUser(claims.getSubject()); // Fails here because of jwtServ being null
System.out.println (foundT + " <~~ Found JWT from redis");
}
catch (final SignatureException e) {
throw new ServletException("Invalid token.");
}
chain.doFilter(req, res);
}
组件(value=“jwtFilter”)
公共类JwtFilter扩展了GenericFilterBean{
RedisClient RedisClient=新RedisClient();
@自动连线
JwtTokenService jwtServ;//由于某种原因为null??!!
@凌驾
公共无效doFilter(最终ServletRequest请求,
最终服务响应结果,
最终筛选器链)抛出IOException、ServletException{
//SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);//未修复此问题
System.out.println(“\n制作请求…”);
最终HttpServletRequest请求=(HttpServletRequest)请求;
最终字符串authHeader=request.getHeader(“授权”);
if(authHeader==null | | |!authHeader.startsWith(“承载者”)){
抛出新的ServletException(“缺少或无效的授权标头”);
}
final String token=authHeader.substring(7);//在“Bearer”之后的部分
试一试{
final Claims=Jwts.parser().setSigningKey(“${userapi.secret}”)
.parseClaimsJws(令牌).getBody();
request.setAttribute(“索赔”,索赔);
setAttribute(“令牌”,令牌);
System.out.println(claims.getSubject()+“因为您手动实例化了
JwtFilter
registrationBean.setFilter(new JwtFilter());
Spring不管理它,因此不注入jwtServ
。
要修复它,请将
jwtFilter
插入UserServiceApplication
并将injectedjwtFilter
设置为registrationBean
@SpringBootApplication
public class UserServiceApplication {
@Autowired
private JwtFilter jwtFilter;
@Bean
public FilterRegistrationBean jwtFilter() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
registrationBean.setFilter(jwtFilter);
...
}
...
当然,它将是
null
…您自己在做新JwtFilter
,没有spring,没有nothing,没有依赖注入。定义一个@Bean
方法来代替。@M.Deinum-Yep!就是这样。创建@Bean
(它只返回一个新的JwtFilter)或者按照公认的答案来做是更好的选择(这也有效)?您可以在添加@Component
时同时执行这两项操作。它将被检测到。但是,最好将它注入方法jwtFilter(jwtFilter jwtFilter)
。你最好重命名你的FilterRegistrationBean
,因为这将覆盖实际的过滤器。这将导致奇怪的调试问题。@M.Deinum-好的,很好&是的,我注意到了!是的!我刚刚通过创建@bean JwtFilter
方法实现了这一点,然后将其添加为过滤器
。这个解决方案看起来像更好的选择!
@SpringBootApplication
public class UserServiceApplication {
@Autowired
private JwtFilter jwtFilter;
@Bean
public FilterRegistrationBean jwtFilter() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
registrationBean.setFilter(jwtFilter);
...
}
...