2017-08-08 8 views
0
私はクラスの持っている

春AMQPエラー:リスナーメソッドは、着信メッセージで呼び出すことができませんでした

public class MqMessage implements Serializable{ 
    private String event; 
    private String absolutePath; 
    private boolean isDirectory; 
    private Integer hash; 
    private Node node; 

    get/set 

} 

Configurationクラス: パブリッククラスRabbitConfiguration {

@Bean 
public ConnectionFactory connectionFactory() { 
    CachingConnectionFactory connectionFactory = 
      new CachingConnectionFactory("localhost"); 
    return connectionFactory; 
} 

@Bean 
public AmqpAdmin amqpAdmin() { 
    return new RabbitAdmin(connectionFactory()); 
} 

@Bean 
public RabbitTemplate rabbitTemplate() { 
    RabbitTemplate template = new RabbitTemplate(connectionFactory()); 
    template.setExchange("exchange-events"); 
    return template; 
} 

//объявляем очередь 
@Bean 
public Queue myQueue1() { 
    return new Queue("queue-events"); 
} 

@Bean 
public FanoutExchange fanoutExchangeA() { 
    return new FanoutExchange("exchange-events"); 
} 

@Bean 
public Binding binding1() { 
    return BindingBuilder.bind(myQueue1()).to(fanoutExchangeA()); 
} 

送信メッセージ

public class ServerHandler implements EventHandler { 

     //сама структура отражающая состояние файлов, содеражащая метоы для работы с ними 
     @Autowired 
     Node fileTreeRoot; 

     SimpleMessageConverter simpleMessageConverter; 

     @Override 
     public void setRoot(Node fileTreeRoot) { 
      this.fileTreeRoot = fileTreeRoot; 
     } 
     @Autowired 
     RabbitTemplate rabbitTemplate; 

     //логика обработки событий 
     @Override 
     public void eventHandle(String event, String path) { 

      /*bussines-logick 
*/ 
      rabbitTemplate.setExchange("exchange-events"); 

      rabbitTemplate.convertAndSend(new MqMessage(event,fileTreeRoot)); 
      return; 
     } 

     public ServerHandler() { 

    } 

リスナー:

public class Client { 
Node rootNodeClient = new Node(); 
EventHandler handlerClient = new ClientHandler(); 


@RabbitListener(queues = "queue-events") 
public void onMessage(MqMessage message) { 
    System.out.println(message.getNode().hashCode()); 
    rootNodeClient = message.getNode(); 
} 

は、エラーが唯一のアプリ

2017-08-08 12:58:02.128 WARN 5024 --- [cTaskExecutor-1] s.a.r.l.ConditionalRejectingErrorHandler : Execution of Rabbit message listener failed.

org.springframework.amqp.rabbit.listener.exception.ListenerExecutionFailedException: Listener method could not be invoked with the incoming message

Caused by: org.springframework.messaging.handler.annotation.support.MethodArgumentNotValidException: Could not resolve method parameter at index 0 in public void prcjt.client.Client.onMessage(prcjt.message.MqMessage): 1 error(s): [Error in object 'message': codes []; arguments []; default message [Payload value must not be empty]]

エラーは常に例外情報から ヘルプしてください

答えて

1
Caused by: org.springframework.messaging.handler.annotation.support.MethodArgumentNotValidException: Could not resolve method parameter at index 0 

存在しない始めている、春が正しくリスナーにMqMessageを解決できませんでしたようですクライアントにmappingJackson2MessageConverterを追加することができます。 this linkを参照してください。

+0

私はストーリーが正反対であると思います。「ペイロード値は空であってはいけません。つまり、変換されたコンテナがリスナーコンテナで正しくボディを逆シリアル化できないように構成されていることを意味します。 'RabbitTemplate'がデフォルトの' SimpleMessageConverter'を使い、標準のJAVAシリアライゼーションを使って 'MqMessage'をシリアライズしているようですが、コンテナファクトリは他のコンバーターをベースにしていて、' mappingJackson2MessageConverter'を指しています。あなたは間違いなく消費者側で同じコンバータを使うべきです –

関連する問題