Spring Boot 2.4.2下YAML配置布尔属性@Value注入不识别报错
问题根因
报错的核心原因是Lombok的@AllArgsConstructor注解生成全参构造函数时,默认不会将字段上的@Value注解复制到对应的构造参数上。Spring在执行构造注入时,识别不到该参数需要从配置文件读取值,会默认尝试注入容器中类型为Boolean的Bean,容器中没有对应Bean就抛出了找不到Bean的异常。
你观察到的两个List类型属性注入正常只是巧合,大概率是项目中刚好存在同类型的List<String> Bean被Spring容器管理,Spring直接注入了该Bean,并没有读取你配置文件里的收件人配置,可以自行校验注入值是否和配置一致确认。
解决方案
方案1:配置Lombok复制@Value注解
这是改动最小的方案,不需要修改现有业务代码:
- 在项目根目录(和
src文件夹同级)新建名为lombok.config的配置文件 - 加入如下配置:
lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Value
- 重新编译项目即可生效。
该配置会告诉Lombok,生成构造函数、setter等方法时,需要将字段上的@Value注解复制到对应的参数上,Spring就能正常识别参数需要读取配置值,完成注入。
方案2:手动编写构造函数
去掉类上的@AllArgsConstructor注解,手动编写构造函数,将@Value注解放到构造参数上:
// 移除@AllArgsConstructor注解 private final Boolean isFeatureActive; private final List<String> emailRecipientsDevelopers; private final List<String> emailRecipientsAdmins; public CronJob(@Value("${perscel.mail.featuretoggle}") Boolean isFeatureActive, @Value("#{'${perscel.mail.recipients.developers}'.split(',')}") List<String> emailRecipientsDevelopers, @Value("#{'${perscel.mail.recipients.admins}'.split(',')}") List<String> emailRecipientsAdmins) { this.isFeatureActive = isFeatureActive; this.emailRecipientsDevelopers = emailRecipientsDevelopers; this.emailRecipientsAdmins = emailRecipientsAdmins; }
方案3:改用@ConfigurationProperties批量加载配置
针对同一前缀的多配置项场景,更推荐使用配置类加载,代码更整洁,也不会出现@Value和Lombok的兼容问题:
- 定义配置类:
@ConfigurationProperties(prefix = "perscel.mail") @Data public class MailProperties { private Boolean featuretoggle; private Recipients recipients; @Data public static class Recipients { private List<String> developers; private List<String> admins; } }
- 在启动类或者任意配置类上添加
@EnableConfigurationProperties(MailProperties.class)注解,启用配置类扫描 - 在需要使用配置的类中直接注入
MailProperties即可:
// 保留@AllArgsConstructor即可,直接注入配置类 private final MailProperties mailProperties;
内容的提问来源于stack exchange,提问作者Trace
相关产品推荐
相关产品推荐

