如何正确配置@Component类

时间:2017-01-23 17:26:12

标签: java spring spring-boot dependency-injection

我有一个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?

3 个答案:

答案 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();

    }