Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 扩展GenericFilterBean的筛选器中的Autowired字段为空_Java_Spring_Spring Boot_Spring Bean - Fatal编程技术网

Java 扩展GenericFilterBean的筛选器中的Autowired字段为空

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;

我正在尝试自动将服务连接到我的请求筛选器。它给了我一个空指针异常,我不太清楚为什么。我在我的控制器中使用了完全相同的autowire类,它可以正常工作

@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
并将injected
jwtFilter
设置为
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);
        ...
    }
    ...