2016-10-27 3 views
0

Ich schreibe Integrationstests für meine Anwendung, die Nachrichten an RabbitMq sendet. Als Teil meiner Testkonfiguration erkläre ich einige RabbitListeners, diese Nachrichten zu erhalten.Nicht in der Lage, Resolver für meine eingehende RabbitMq-Nachricht zu konfigurieren

Ich weiß, ich bin nicht zu weit weg, denn diese Arbeit ist:

@RabbitListener(bindings = @QueueBinding(
    value = @Queue(
     value = "myQueue", 
     autoDelete = "true", 
     exclusive = "false", 
     durable = "false"), 
    exchange = @Exchange(
     value = "myExchange", 
     autoDelete = "true", 
     durable = "true"), 
    key = "myRoutingKey")) 
public void confirmEligibilityMessage(Object eligibilityEvent) { 
    log.info("received message [{}]", eligibilityEvent); 
    receivedMessages.add(eligibilityEvent); 
} 

-> Nachricht

jedoch empfangen wird, würde ich die Nachricht gerne direkt auf den erwarteten umgewandelt werden Art, so zu modifizieren ich die Unterschrift des Verfahrens durch die Art der Nutzlast Zugabe:

public void confirmConsolidationEligibilityMessage(@Payload EligibilityEvent eligibilityEvent) 

und ich bin immer dieses Problem: „Kein Konverter gefunden zu konvertieren ..“

Caused by:  org.springframework.amqp.support.converter.MessageConversionException: Cannot handle message 
... 13 common frames omitted 
Caused by: org.springframework.messaging.converter.MessageConversionException: No converter found to convert to class messaging.outgoing.EligibilityEvent, message=GenericMessage [payload={"requestCode":"someRequestCode","isEligible":false}, headers=... 

Ich habe versucht, was here vorgeschlagen und machte meine GlobalEventBusListener RabbitListenerConfigurer wie folgt implementieren:

public class GlobalEventBusListener implements RabbitListenerConfigurer { 

private final List<Object> receivedMessages = new ArrayList<>(); 

@Override 
public void configureRabbitListeners(RabbitListenerEndpointRegistrar registrar) { 
    registrar.setMessageHandlerMethodFactory(myHandlerMethodFactory()); 
} 

@Bean 
public MessageConverter jackson2Converter() { 
    MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter(); 
    return converter; 
} 

@Bean 
public DefaultMessageHandlerMethodFactory myHandlerMethodFactory() { 
    DefaultMessageHandlerMethodFactory factory = new DefaultMessageHandlerMethodFactory(); 
    factory.setMessageConverter(jackson2Converter()); 
    return factory; 
} 

Aber ich habe Probleme immer noch da Konvertierung nicht richtig passieren - Nachricht allerdings ist anders ..

Caused by: java.lang.IllegalStateException: No suitable resolver for argument [0] [type=messaging.outgoing.EligibilityEvent] 
HandlerMethod details: 
Controller [mocks.GlobalEventBusListener] 
Method [public void mocks.GlobalEventBusListener.confirmEligibilityMessage(messaging.outgoing.EligibilityEvent)] 

Irgendeine Idee von dem, was ich versuchen könnte? Ich bin mir nicht sicher, wie ich weiter untersuchen soll. Soll ich alle von Spring Boot instanziierten Beans protokollieren und von hier aus starten? welche Art von Bohnen sollte hier sein, damit es funktioniert? Mit Frühling Boot „Magie“, dachte ich zunächst, dass einfach wie unten in meinem Zusammenhang eine MessageConverter mit würde den Trick zu tun, aber es sieht aus wie es nicht der Fall ist:

@Bean 
public MessageConverter jackson2Converter() { 
    MappingJackson2MessageConverter converter = new MappingJackson2MessageConverter(); 
    return converter; 
} 

Dank !!

Antwort

0

Dank Garys Hilfe und ein bisschen mehr Lesen in der Dokumentation, konnte ich es beheben. Nebenbei verwende ich Spring amqp 1.5.6, also < 1.6.

  • erste Sache ist, dass ich die Nachricht als JSON-String sendete, die AmqpTemplate des Wandlers unter Umgehung: durch direkt an amqpTemplate.convertAndSend Methode meines Objekt übergeben, ohne es selbst zu Json Umwandlung Header richtig eingestellt wurde, um den Empfänger zu helfen Identifizieren Sie den Inhalt ist Json.
  • Sekunden, ich hatte einfach diese in meiner Config hinzuzufügen:

-

@Bean 
public Jackson2JsonMessageConverter jackson2Converter() { 
    Jackson2JsonMessageConverter converter = new Jackson2JsonMessageConverter(); 
    return converter; 
} 

@Bean 
public RabbitListenerContainerFactory rabbitListenerContainerFactory() { 
    SimpleRabbitListenerContainerFactory simpleRabbitListenerContainerFactory = new SimpleRabbitListenerContainerFactory(); 
    simpleRabbitListenerContainerFactory.setConnectionFactory(connectionFactory()); 
    simpleRabbitListenerContainerFactory.setMessageConverter(jackson2Converter()); 
    return simpleRabbitListenerContainerFactory; 
} 
1

Verwenden Sie eine Jackson2JsonMessageConverter von spring-amqp - siehe the documentation.

Auch ab Version 1.6, wenn Anmerkungen mit @RabbitListener (auf Methoden), die abgeleitete Typinformationen zu den MessageProperties hinzugefügt; ...

Das Framework konfiguriert die Art der Konverter basierend auf der Methodensignatur konvertieren.

+0

Vielen Dank Gary, ich diesen Teil des Dokuments übersehen hatte. Ich konzentrierte mich auf den Empfängerteil, aber ich schickte die Nachricht nicht richtig: Ich schickte es als String, so dass der Inhaltstyp in den Headern nicht richtig auf Json eingestellt war. –

1

Wenn alle Nachrichten vom gleichen Typ sein (mit dem gleichen MessageConverter werden deserialisiert) ist es genug Jackson2JsonMessageConverter zu Ihrem Anwendungskontext hinzuzufügen:

@Bean 
MessageConverter messageConverter(ObjectMapper objectMapper) { 
    Jackson2JsonMessageConverter jackson2JsonMessageConverter = new Jackson2JsonMessageConverter(); 
    jackson2JsonMessageConverter.setJsonObjectMapper(objectMapper); 
    return jackson2JsonMessageConverter; 
} 

Passing ObjectMapper als Parameter können Sie konfigurieren, Jackson mit Spring Boot Konfigurationseigenschaften.

Da es für mich am Anfang nicht ganz klar war, wie Spring-Boot und Spring AMQP zu konfigurieren, dass Nachrichten Serialisierung/Deserialisierung JSON I Beispielprojekt erstellt Sie können einen Blick haben wollen: https://github.com/maciejwalkowiak/spring-boot-spring-amqp-java8-lombok-sample

Verwandte Themen