2016-04-05 17 views
0

Ich benutze Spring 4.2 und spring-amqp 1.5.5 und ich habe meine eigene org.springframework.amqp.support.converter.MessageConverter implementiert. Dieser Nachrichtenkonverter soll zwischen einem org.springframework.amqp.core.Message und einem Java-Objekt mappen, indem er eine Eigenschaft betrachtet, die im Nachrichtentext enthalten ist. Aber ich kann keinen Weg finden, diesen Nachrichtenkonverter anzuwenden, um in Verbindung mit der @RabbitListener Anmerkung verwendet zu werden. Was ich will, ist, etwas zu tun wie folgt aus:Wie kann man einen benutzerdefinierten org.springframework.amqp.support.converter.MessageConverter mit RabbitListener-Annotation verwenden?

@RabbitListener 
public void process(MyEvent myEvent) { 
.. 
} 

Aber Frühling eine DefaultMessageHandlerMethodFactory zu verwenden scheint, auf die Sie nur Instanzen von org.springframework.messaging.converter.MessageConverter zuweisen können, die nicht die gleiche Art von MessageConverter ist, die ich verwende.

Der Grund für die Implementierung meiner eigenen org.springframework.amqp.support.converter.MessageConverter ist, weil wir Nachrichten von Nicht-Java-Anwendungen generieren, die nicht die magische __TypeId__ Header von Spring verwendet, um die Klasse zu deserialisieren den Körper in.

Ich habe versucht, ein SimpleRabbitListenerContainerFactory zu definieren:

@Bean 
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory() { 
    SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); 
    factory.setConnectionFactory(rabbitConnectionFactory()); 
    factory.setMessageConverter(messageConverter()); 
    return factory; 
} 

aber es scheint nicht verwendet zu werden (oder zumindest macht es keinen Unterschied machen).

Also meine Frage ist, wie kann ich meine org.springframework.amqp.support.converter.MessageConverter anwenden?

Antwort

2

Sie tun es auf die richtige Weise, also muss etwas anderes passieren, vielleicht wird die Bohne von einer anderen Definition überschrieben? Sie könnten versuchen, der Bean einen anderen Namen zu geben und sie explizit in @RabbitListener zu referenzieren.

Wir haben viele Testfälle, die diese Funktion this one for example und seine use here testen.

Übrigens, in der kommenden Version 1.6 the type from the listener method is provided to the converter, die mit fehlenden __TypeId__ Header hilft.

+0

Sie haben Recht, es gab eine andere Beandefinition, die es überschrieb (das hatte den gleichen Namen). Als Randnotiz frage ich mich, warum ich mich in meinem Fall nicht über Duplikatdefinitionen beschwert habe. Vielen Dank für den Hinweis! – Johan

+1

Das ist ein normales Spring Framework-Verhalten - es soll so funktionieren, dass eine Anwendung beispielsweise eine Bean-Definition in einem Jar überschreiben kann. –