2017-01-23 4 views
1

Ich habe einen SqsQueueSender, um Nachrichten an AWS zu senden. Ich möchte diese Klasse testen. Mein Gedanke ist, dass es eine @Component sein sollte, die in die Klassen injiziert wird, die es brauchen. Wichtig ist, dass ich den Endpunkt der SqsQueueSender so konfigurieren möchte, dass er sich in Test- und Produktionsumgebungen unterscheidet.So konfigurieren Sie die @ Component-Klasse

Ich habe @Autowired und @Component um die Klassen verschiedene Wege verlegt, muss aber ein grundlegendes Missverständnis haben. Hier ist meine letzte Konfiguration:

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

Die Fehlermeldung beim Start Staaten

Verursacht durch: org.springframework.beans.factory.NoSuchBeanDefinitionException: Nein qualifizierenden Bohne vom Typ ‚com.amazonaws. services.sqs.AmazonSQSAsyncClient 'verfügbar: erwartet mindestens 1 Bean, die sich als Autowire-Kandidat qualifiziert. Dependency Anmerkungen: {}

SqsQueueSender Zur Umsetzung müssen Sie eine AmazonSQSAsyncClient passieren. Wie stelle ich sicher, dass diese Komponente auf eine vorhandene Bean dieses Typs zugreifen kann?

+0

Ich weiß nichts über aws. Aber wo ist die Definition von 'AmazonSQSAsyncClient' eine Bean? – Patrick

+0

Wenn ich Ihre Frage verstehe, ist diese Klasse in meinem Projekt nicht als '@ Bean' definiert. Wie erstelle ich einen @Bean aus einer bestehenden Klasse, die du importiert hast? –

Antwort

1

Sie müssen eine Konfigurationsklasse erstellen. In Ihrem Fall wäre es so etwas wie dieses:

@Configuration 
public class AWSConfig { 

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

    // set up the client 

    return awsSQSAsyncClient; 
} 

Wenn es Probleme mit der Injektion fügen Sie dann Qualifier in qsQueueSender hat:

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

können Sie auch dies die XML-Konfiguration tun verwenden, aber wie Sie verwenden Anmerkungen, dann ist dies mehr ratsam Ansatz.

+0

Danke. Meine App startet jetzt. Ich bin immer noch nicht in der Lage, Tests gegen die Klasse auszuführen, die den 'Client' verwendet. Wie würde ich eine Instanz von 'SqsQueueSender' in meiner Testklasse instanziieren? –

+0

Welchen Testrahmen verwenden Sie mit Junit? –

+0

Ja, das Testframework ist Junit. –

0

Fügen Sie @ Component/@ Service in com.amazonaws.services.sqs.AmazonSQSAsyncClient hinzu oder geben Sie ein Objekt mit @Bean-Annotation aus der Konfigurationsklasse zurück.

+0

Re: "ein Objekt davon mit @Bean Annotation aus der Konfigurationsklasse zurückgeben." Bedeutet das, eine mit @Bean annotierte Klasse zu erstellen, die beschreibt, wie man einen 'AmazonSQSAsyncClient' konstruiert? Wenn AmazonSQSAsyncClient eine konkrete Klasse ist, wie bewerkstellige ich dies? –

Verwandte Themen