SpringBoot的config bean使用中的坑

@Data
@Component
@Builder
public class KnowledgeInfoConfig {
    @Value("${knowledge.connectTimeout:500}")
    private Integer connectTimeout;

    @Value("${knowledge.socketTimeout:500}")
    private Integer socketTimeout;

    @Value("${knowledge.connectionRequestTimeout:500}")
    private Integer connectionRequestTimeout;

    @Value("${knowledge.requestTimeout:500}")
    private Integer requestTimeout;

    @Value("${knowledge.knowledgeInfoUrl}")
    private String knowledgeInfoUrl;

}

上述的代码在项目启动时,会出现:Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'java.lang.Integer' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

报错信息表明 Spring 在实例化 KnowledgeInfoConfig 类时出现了问题,因为无法找到类型为 java.lang.Integer 的 bean。

这种情况通常是因为 Spring 尝试注入 KnowledgeInfoConfig 类的构造函数参数时,发现了 Integer 类型的参数,但无法找到匹配的 bean。

在您的 KnowledgeInfoConfig 类中,您使用了 @Value 注解来注入属性值,这通常不需要构造函数注入。但是,报错信息表明 Spring 正在尝试通过构造函数注入属性值。

  1. 移除构造函数: 如果您不需要使用构造函数注入属性值,可以尝试移除 KnowledgeInfoConfig 类的构造函数。Spring 应该能够通过默认的无参构造函数实例化该类,并使用 @Value 注解来注入属性值。

  2. 明确声明构造函数: 如果您确实需要一个构造函数来处理其他逻辑,可以在 KnowledgeInfoConfig 类中显式声明一个无参构造函数,并确保所有属性都由 @Value 注解注入,而不是通过构造函数。

当您在类上添加 @Builder 注解时,Lombok 会为该类生成一个包含所有非静态字段的静态内部类,并为每个字段生成一个相应的设置方法。这样您就可以使用这个生成的建造者模式来创建对象,而不必编写繁琐的构造函数。

然而,在 Spring 中,当您的类需要被实例化为一个 bean,并且其中的属性需要通过 @Value 注解来注入时,@Builder 注解会产生一些影响。具体来说,Lombok 生成的建造者模式并不会为生成的建造者类添加 @Value 注解所需的构造函数。

因此,在您的情况下,当 Spring 尝试实例化 KnowledgeInfoConfig 类时,它需要找到一个合适的构造函数来满足 @Value 注解所需的依赖注入。但是由于 @Builder 注解生成的建造者类没有合适的构造函数,因此 Spring 无法找到满足依赖注入需求的构造函数,最终导致了报错。

解决这个问题的方法之一是在类上添加一个无参构造函数,并确保所有的属性都可以通过 @Value 注解注入。或者,您可以考虑在使用 @Builder 注解的类中手动创建一个建造者模式,以满足 Spring 对依赖注入的要求。

修改后在类注解上添加如下注解即可:

@NoArgsConstructor
@AllArgsConstructor

只加无参构造注解也会出现编译问题:

无法将类 com.xiaoju.uemc.waymo.config.KnowledgeInfoConfig中的构造器 KnowledgeInfoConfig应用到给定类型;

原因:

具体来说,@NoArgsConstructor 注解会生成一个无参构造函数,而 @Builder 注解会生成一个具有参数的构造函数。当您同时在一个类上使用这两个注解时,它们可能会产生冲突,导致编译错误。

@Data
@Component
@Builder
public class KnowledgeInfoConfig {
    @Value("${knowledge.connectTimeout:500}")
    private Integer connectTimeout;
}

编译后:

public class KnowledgeInfoConfig {
    private Integer connectTimeout;

    // 构造器(通常为私有,但这里只是示例)
    private KnowledgeInfoConfig(Integer connectTimeout) {
        this.connectTimeout = connectTimeout;
    }

    // 静态内部建造者类
    public static class KnowledgeInfoConfigBuilder {
        private Integer connectTimeout;

        // setter 方法,用于设置属性值
        public KnowledgeInfoConfigBuilder connectTimeout(Integer connectTimeout) {
            this.connectTimeout = connectTimeout;
            return this;
        }

        // build 方法,用于构建对象实例
        public KnowledgeInfoConfig build() {
            return new KnowledgeInfoConfig(connectTimeout);
        }
    }
}

相关推荐

  1. SpringBootconfig bean使用

    2024-03-28 13:40:05       17 阅读
  2. springboot 连接hive

    2024-03-28 13:40:05       11 阅读
  3. 项目当中使用JPA、Hibernate、MyBatis遇到

    2024-03-28 13:40:05       35 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-28 13:40:05       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-28 13:40:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-28 13:40:05       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-28 13:40:05       20 阅读

热门阅读

  1. 面试算法-114-打家劫舍 II

    2024-03-28 13:40:05       19 阅读
  2. Spring总结

    2024-03-28 13:40:05       17 阅读
  3. Kubernetes中的Pod处于Pending状态的原因

    2024-03-28 13:40:05       15 阅读
  4. DevOps迈向标准化,平台工程让开发运维更轻松

    2024-03-28 13:40:05       17 阅读
  5. 2024年腾讯云服务器价格表,2核4G5M带宽165元一年

    2024-03-28 13:40:05       39 阅读
  6. 八道Python入门级题目及答案详解

    2024-03-28 13:40:05       17 阅读
  7. springboot+mybatis项目集成p6spy输出格式化sql日志

    2024-03-28 13:40:05       15 阅读
  8. 鸿蒙开发 TypeScript 基础语法

    2024-03-28 13:40:05       21 阅读
  9. 哈工大 sse C语言 困难

    2024-03-28 13:40:05       18 阅读
  10. Linux-arm指令集和arm架构

    2024-03-28 13:40:05       18 阅读