2017-01-23 1 views
1

AWS에 메시지를 보낼 SqsQueueSender가 있습니다. 나는이 수업을 시험하고 싶다. 내 생각에 그것은 필요한 클래스에 주입 된 @Component이어야합니다. 중요한 점은 테스트 환경과 프로덕션 환경에서 다를 점인 SqsQueueSender의 끝점을 구성하려고합니다.@Component 클래스를 적절하게 구성하는 방법

저는 @Autowired와 @Component를 여러 가지 다른 방법으로 이동 시켰지만 기본적인 오해가 있어야합니다. org.springframework.beans.factory.NoSuchBeanDefinitionException :

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()); 
    } 
} 

오류 메시지에 의한 시동 상태

에 : 유형 'com.amazonaws 없음 자격 콩 여기 내 최신 구성입니다. services.sqs.AmazonSQSAsyncClient 'available : expected autowire 후보로 자격이되는 적어도 하나의 bean. 종속성 주석 : {}

은 당신이 AmazonSQSAsyncClient를 통과해야 SqsQueueSender을 구현합니다. 이 구성 요소가 해당 유형의 기존 Bean에 액세스 할 수 있는지 확인하려면 어떻게해야합니까?

+0

aws에 대해 아무 것도 몰라요. 하지만 'AmazonSQSAsyncClient' 정의가 bean이되는 위치는 어디입니까? – Patrick

+0

당신의 질문을 이해한다면, 그 클래스는 프로젝트에서'@ Bean'으로 정의되지 않습니다. 어떻게 가져온 기존 클래스에서 @Bean을 만들 수 있습니까? –

답변

1

구성 클래스를 만들어야합니다. 귀하의 경우는이 같은 것입니다 :

@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 구성을 사용하지만 사용으로 할 수 있습니다 그러면 주석이 더 적합한 방법입니다.

+0

감사합니다. 이제 내 앱이 시작됩니다. 나는 아직도'Client'를 사용하는 클래스에 대한 테스트를 수행 할 수 없습니다. 내 테스트 클래스에서'SqsQueueSender' 인스턴스를 어떻게 인스턴스화할까요? –

+0

Junit을 사용하는 테스트 프레임 워크는 무엇입니까? –

+0

예, 테스트 프레임 워크는 Junit입니다. –

0

com.amazonaws.services.sqs.AmazonSQSAsyncClient에서 @ Component/@ Service를 추가하거나 구성 클래스에서 @Bean 주석을 사용하여 해당 객체를 반환하십시오.

+0

Re : "구성 클래스에서 @Bean 어노테이션을 사용하여 그 객체를 반환하십시오." 그것은'AmazonSQSAsyncClient'를 생성하는 방법을 설명하는 @Bean으로 주석 된 클래스를 만드는 것을 의미합니까? AmazonSQSAsyncClient가 구체적인 클래스 인 경우 어떻게해야합니까? –

관련 문제