首页 > 解决方案 > Spring Bean - 带参数的构造函数

问题描述

我在构造函数中看到一个错误,上面写着

“字符串队列名称”无法自动装配。

AmazonSQSAsync在另一个类中定义了组件,但没有 queueName。为什么构造函数试图自动装配参数,我该如何解决这个问题?

@Configuration
public class SqsQueueHealthIndicator extends AbstractHealthIndicator {

    private final AmazonSQSAsync amazonSQSAsync;
    private final String queueName;

    public SqsQueueHealthIndicator(AmazonSQSAsync amazonSQSAsync, String queueName) {
        this.amazonSQSAsync = amazonSQSAsync;
        this.queueName = queueName;
    }

    @Override
    protected void doHealthCheck(Health.Builder builder) {
        try {
            amazonSQSAsync.getQueueUrl(queueName);
            builder.up();
        } catch (QueueDoesNotExistException e) {
            builder.down(e);
        }
    }

    @Bean
    SqsQueueHealthIndicator queueHealthIndicator(@Autowired AmazonSQSAsync amazonSQSAsync, @Value("${url}") String queueName) {
        return new SqsQueueHealthIndicator(amazonSQSAsync, queueName);
    }

    @Bean
    SqsQueueHealthIndicator deadLetterQueueHealthIndicator(@Autowired AmazonSQSAsync amazonSQSAsync, @Value("${dlqurl}") String deadLetterQueueName) {
        return new SqsQueueHealthIndicator(amazonSQSAsync, deadLetterQueueName);
    }

}

标签: javaspringspring-boot

解决方案


因为您要声明它,final所以它的值必须被初始化。

您没有提供默认值,因此 Spring 了解它的值将被注入。

所以你有2个选择:

  1. 删除final修饰符。用于@Value从配置文件中注入您的值。
  2. 创建一个 bean 类型的 String 并注入它。你应该把它命名为:

    @Bean("queueName")
    public String getQueueName {return "xyz";}
    

并注入:

    @Autowire
    @Qualifier("queueName")
    private final String queueName;

在正常情况下,选项 1 是首选。


推荐阅读