You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Lombok构造注解替代@Autowired?遇字段初始化及Bean创建错误

用Lombok构造注解替代@Autowired的问题及解决

初始问题:Lombok构造注解替代@Autowired报错

原代码通过@Autowired注入jwtUtils(带final修饰)和userDetailsService,尝试用@RequiredArgsConstructor或@AllArgsConstructor替代@Autowired时,因final字段未初始化报错,考虑过将字段设为null但不确定合理性。

解决方案

  1. 移除@Autowired并保留final修饰
    Spring 4.3+版本支持无需@Autowired的构造方法注入,@RequiredArgsConstructor会自动为所有final修饰的字段生成对应的构造方法,Spring会通过该构造方法完成依赖注入。调整后的代码如下:
    @RequiredArgsConstructor
    public class AuthTokenFilter extends OncePerRequestFilter {
    
        private final JwtUtils jwtUtils;
        private final UserDetailsServiceImpl userDetailsService;
    
        private static final Logger logger = LoggerFactory.getLogger(AuthTokenFilter.class);
    
        // 其余方法保持不变
    }
    
  2. 不要将字段设为null
    设为null会导致后续调用jwtUtils或userDetailsService时出现空指针异常,完全不可取。

后续问题:创建Bean时报错

采用上述方案后,在Bean创建代码中出现报错:“预期2个参数,但实际传入0个”
对应的Bean创建代码:

@Bean
public AuthTokenFilter authenticationJwtTokenFilter() {
    return new AuthTokenFilter();
}

报错原因

@RequiredArgsConstructor生成了包含两个参数(jwtUtils和userDetailsService)的构造方法,而当前@Bean方法调用的是无参构造,参数不匹配导致报错。

解决方案

修改@Bean方法,让Spring注入所需依赖并传入构造方法:

@Bean
public AuthTokenFilter authenticationJwtTokenFilter(JwtUtils jwtUtils, UserDetailsServiceImpl userDetailsService) {
    return new AuthTokenFilter(jwtUtils, userDetailsService);
}

这种方式既符合构造注入的最佳实践,也保证了依赖的不可变性,避免空指针风险。

内容的提问来源于stack exchange,提问作者Jack

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 15:35:39