我有一个SqsQueueSender来向AWS发送消息。我想测试这门课。我的想法是它应该是@Component
注入需要它的类。重要的是,我想将SqsQueueSender
的端点配置为在测试与生产环境中不同。
我一直在以不同的方式围绕课程移动@Autowired和@Component,但必须有一些基本的误解。这是我的最新配置:
package com.foo.fulfillmentApi.dao;
import com.amazonaws.services.sqs.AmazonSQSAsyncClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.aws.messaging.core.QueueMessagingTemplate;
import org.springframework.messaging.support.MessageBuilder;
@Component
public class SqsQueueSender {
private static final Logger LOGGER = LoggerFactory.getLogger(SqsQueueSender.class);
private final QueueMessagingTemplate queueMessagingTemplate;
@Autowired
AmazonSQSAsyncClient amazonSQSAsyncClient;
//This value is from /resources/application.properties
private @Value("${sqs.endpoint}") String endpoint;
public SqsQueueSender(AmazonSQSAsyncClient amazonSqsAsyncClient) {
amazonSqsAsyncClient.setEndpoint(endpoint);
this.queueMessagingTemplate = new QueueMessagingTemplate(amazonSqsAsyncClient);
}
public void send(String queueName, String message) {
this.queueMessagingTemplate.convertAndSend(queueName, MessageBuilder.withPayload(message).build());
}
}
启动时的错误消息
引起: org.springframework.beans.factory.NoSuchBeanDefinitionException:没有 合格的bean类型 'com.amazonaws.services.sqs.AmazonSQSAsyncClient'可用:预期 至少有1个符合autowire候选资格的bean。依赖 注释:{}
要实施SqsQueueSender
,您必须传递AmazonSQSAsyncClient
。如何确保此组件可以访问该类型的现有bean?
答案 0 :(得分:2)
您需要创建配置类。在你的情况下,它将是这样的:
@Configuration
public class AWSConfig {
@Bean(name ="awsClient")
public AmazonSQSAsync amazonSQSClient() {
AmazonSQSAsyncClient awsSQSAsyncClient
= new AmazonSQSAsyncClient();
// set up the client
return awsSQSAsyncClient;
}
如果注入有问题,请在qsQueueSender中添加限定符:
@Autowired
@Qualifier("awsClient")
AmazonSQSAsyncClient amazonSQSAsyncClient;
您也可以使用xml配置执行此操作,但在使用注释时,这是更明智的方法。
答案 1 :(得分:0)
在com.amazonaws.services.sqs.AmazonSQSAsyncClient中添加@ Component / @ Service,或者使用配置类中的@Bean注释返回该对象。
答案 2 :(得分:0)
如果您使用springboot-如下所示在启动应用程序文件中定义
@Bean
public AmazonSNSAsync amazonSNSClient() {
ClientConfiguration config = new ClientConfiguration();
return AmazonSNSAsyncClient.asyncBuilder().withClientConfiguration(config)
.withRegion(Regions.fromName(region))
.withCredentials(new DefaultAWSCredentialsProviderChain())
.build();
}