java - 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);
}
}
解决方案
因为您要声明它,final
所以它的值必须被初始化。
您没有提供默认值,因此 Spring 了解它的值将被注入。
所以你有2个选择:
- 删除
final
修饰符。用于@Value
从配置文件中注入您的值。 创建一个 bean 类型的 String 并注入它。你应该把它命名为:
@Bean("queueName") public String getQueueName {return "xyz";}
并注入:
@Autowire
@Qualifier("queueName")
private final String queueName;
在正常情况下,选项 1 是首选。
推荐阅读
- php - 未找到 Guzzle。客户端令牌授予的 API 请求
- azure - Azure AD 链接角色到组
- reactjs - 如何使用 jest 和酶在 reactJs 中构建测试用例以使用 fetch 调用进行测试
- d3.js - 如何显示 .tickValues() 中指定的确切数字
- ruby-on-rails - 带有 GCS 文件的 ActiveStorage 不上传(签名不是 base64 编码的)|| (签名不匹配)
- java - 返回 ?扩展类型
- c# - 升级到 3.0 后 ASP.NET Core 身份验证中断
- javascript - 使用多种方法实现事件管理器
- javascript - 检查接收到的参数是否与对象的名称相同,并从这些对象中获取属性的随机值
- python - 传递 URL 参数时出现意外的关键字