java - 如何正确配置@Component类

标签 java spring spring-boot dependency-injection

我有一个 SqsQueueSender 来向 AWS 发送消息。我想测试一下这门课。我的想法是,它应该是一个 @Component ,注入(inject)到需要它的类中。重要的是,我想将 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());
    }
}

启动时的错误消息状态

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.amazonaws.services.sqs.AmazonSQSAsyncClient' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}

要实现 SqsQueueSender,您必须传递 AmazonSQSAsyncClient。我如何确保该组件可以访问该类型的现有 bean?

最佳答案

您需要创建一个配置类。在你的情况下,它会是这样的:

@Configuration
public class AWSConfig {

   @Bean(name ="awsClient")
   public AmazonSQSAsync amazonSQSClient() {
     AmazonSQSAsyncClient awsSQSAsyncClient 
            = new AmazonSQSAsyncClient();

     // set up the client

     return awsSQSAsyncClient;
}

如果注入(inject)有问题,请在 qsQueueSender 中添加限定符:

@Autowired
@Qualifier("awsClient")
AmazonSQSAsyncClient amazonSQSAsyncClient;

您也可以使用 xml 配置来执行此操作,但由于您使用的是注释,因此这是更明智的方法。

关于java - 如何正确配置@Component类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41812104/

相关文章:

spring - GET 请求在 Postman 中有效,但在 RestTemplate 中无效 - Spring Boot

java - 不同字符串连接到 mysql 的应用程序属性

java - 从 const 方法调用 JNI 函数

java - 尝试用 Java 确定一个简单的解密算法

Java:序列化单例的实际用例?

java - 尝试记录警告时 ESAPI 抛出 org.owasp.esapi.errors.ConfigurationException

java - 将日期字段与 jackson-dataformat-csv 一起使用时失败并出现 InvalidFormatException

Java:构造函数、静态方法、公共(public)方法、私有(private)方法的位置?

spring - 为什么 SessionFixationProtectionStrategy 不迁移 session 属性?

java - 在运行时向 Spring bean 添加属性值