Сериализация объекта Json в Java-объект внутри Spring Rabbit Listener выдает исключение - PullRequest
0 голосов
/ 03 октября 2018

Я хочу прослушивать сообщения, поступающие в очередь Rabbit, со слушателем Spring Rabbit.Мой класс выглядит очень просто так:

    @Component
public class MailMessageRabbitListener {
    private MailRepository mailRepository;
    private MailService mailService;

    @Autowired
    public MailMessageRabbitListener(MailRepository mailRepository, MailService mailService) {
        this.mailRepository = mailRepository;
        this.mailService = mailService;
    }

    @Bean
    public MessageConverter messageConverter() {
        return new Jackson2JsonMessageConverter();
    }

    @RabbitListener(queues = "msmail.queue")
    public void receiveMailMessage(JsonMailMessage jsonMailMessage) throws Exception {
        System.out.println(jsonMailMessage);
    }
}

Мой класс отображения JsonMailMessage выглядит так:

@Data
@NoArgsConstructor
@RequiredArgsConstructor
public class JsonMailMessage {
    @NonNull
    private String userToken;
    @NonNull
    private String sendTo;
    @NonNull
    private String subject;
    @NonNull
    private String content;
    @NonNull
    private String[] files;

}

Теперь я могу успешно прослушивать очередь, проблема в том, чтоЯ отправляю такое сообщение в очереди Rabbit:

RabbitMessage

Массив Json заполнен файлами в кодировке base64, которые должны быть базовыми выражениями String, поэтому Jackson2JsonMessageConverterдолжен иметь возможность конвертировать файлы.

Однако я получаю исключение такого рода:

Bean [---------messaging.MailMessageRabbitListener@35ff072c]
    at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:185) ~[spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
    at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.onMessage(MessagingMessageListenerAdapter.java:120) ~[spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:1414) ~[spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.actualInvokeListener(AbstractMessageListenerContainer.java:1337) ~[spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:1324) ~[spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
    at org.springframework.amqp.rabbit.listener.AbstractMessageListenerContainer.executeListener(AbstractMessageListenerContainer.java:1303) ~[spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.doReceiveAndExecute(SimpleMessageListenerContainer.java:785) [spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.receiveAndExecute(SimpleMessageListenerContainer.java:769) [spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer.access$700(SimpleMessageListenerContainer.java:77) [spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
    at org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer$AsyncMessageProcessingConsumer.run(SimpleMessageListenerContainer.java:1010) [spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
    at java.lang.Thread.run(Thread.java:748) [na:1.8.0_171]
Caused by: org.springframework.messaging.converter.MessageConversionException: Cannot convert from [[B] to [-----dto.JsonMailMessage] for GenericMessage [payload=byte[118], headers={amqp_receivedDeliveryMode=NON_PERSISTENT, amqp_receivedRoutingKey=msmail.queue, amqp_deliveryTag=1, amqp_consumerQueue=msmail.queue, amqp_redelivered=false, id=b997e8cb-3424-df90-5370-aa4cf79175be, amqp_consumerTag=amq.ctag-lL9Y6R67fJc6DyCHAiWQRA, Content-Type=application/json, timestamp=1538554985476}]
    at org.springframework.messaging.handler.annotation.support.PayloadArgumentResolver.resolveArgument(PayloadArgumentResolver.java:144) ~[spring-messaging-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:116) ~[spring-messaging-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:137) ~[spring-messaging-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.messaging.handler.invocation.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:109) ~[spring-messaging-5.0.5.RELEASE.jar:5.0.5.RELEASE]
    at org.springframework.amqp.rabbit.listener.adapter.HandlerAdapter.invoke(HandlerAdapter.java:51) ~[spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
    at org.springframework.amqp.rabbit.listener.adapter.MessagingMessageListenerAdapter.invokeHandler(MessagingMessageListenerAdapter.java:182) ~[spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
    ... 10 common frames omitted

Обновление

Работает,сообщение преобразуется в объект Java.Проблема начинается, когда я хочу вернуть объект напрямую из метода Listener.

 @RabbitListener(queues = "msmail.queue")
public JsonMailMessage receiveMailMessage(JsonMailMessage jsonMailMessage){
  return jsonMailMessage;
}

Выдает другое исключение:

Caused by: org.springframework.amqp.AmqpException: Cannot determine ReplyTo message property value: Request message does not contain reply-to property, and no default response Exchange was set.
    at org.springframework.amqp.rabbit.listener.adapter.AbstractAdaptableMessageListener.getReplyToAddress(AbstractAdaptableMessageListener.java:398) ~[spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
    at org.springframework.amqp.rabbit.listener.adapter.AbstractAdaptableMessageListener.handleResult(AbstractAdaptableMessageListener.java:307) ~[spring-rabbit-2.0.3.RELEASE.jar:2.0.3.RELEASE]
    ... 10 common frames omitte

1 Ответ

0 голосов
/ 03 октября 2018

content_type - это общеизвестное свойство, а не произвольный заголовок;вместо этого добавьте его к Properties:.

Нажмите ? в пользовательском интерфейсе, чтобы увидеть известные свойства.

Поскольку тип контента отсутствует, преобразователь просто возвращает * 1008.* без изменений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...