java - 无法将 Message 对象从 RabbitMQ 转换为 java 类

标签 java spring rabbitmq spring-amqp

我创建了 RabbitListener 以从 RabbitMQ 队列获取消息。

我的 rabbitMQ 消息:

Properties  
priority:   0
delivery_mode:  2
headers:    
__TypeId__: com.kmb.bank.models.Transfer
content_encoding:   UTF-8
content_type:   application/json
Payload
356 bytes
Encoding: string


{"userAccountNumber":"1111444422221111","title":"123","recipientName":"123","recipientAccountNumber":"1234123412341234","amount":123.0,"localDateTime":{"nano":526106200,"year":2018,"monthValue":11,"dayOfMonth":29,"hour":20,"minute":43,"second":0,"month":"NOVEMBER","dayOfWeek":"THURSDAY","dayOfYear":333,"chronology":{"id":"ISO","calendarType":"iso8601"}}}

我的监听器方法:

@Autowired
private Jackson2JsonMessageConverter jackson2JsonMessageConverter;

@RabbitListener(queues = "kolejka")
public void listen(Message message) {
    try {
        Transfer transfer = (Transfer) jackson2JsonMessageConverter.fromMessage(message);
        log.info(transfer);
    } catch (Exception e) {
        log.debug("Error thrown while listening + " + e.getMessage());
    }

}

bean 配置: @ bean 公共(public) ObjectMapper objectMapper() { 返回新的 ObjectMapper();

@Bean
public Jackson2JsonMessageConverter jackson2JsonMessageConverter() {
    return new Jackson2JsonMessageConverter(objectMapper());
}

和转类:

package com.kmb.transactionlogger.models;

@AllArgsConstructor
public class Transfer {
    @Getter @Setter
    private String userAccountNumber;
    @Getter @Setter
    private String title;
    @Getter @Setter
    private String recipientName;
    @Getter @Setter
    private String recipientAccountNumber;
    @Getter @Setter
    private double amount;
    @Getter @Setter
    private LocalDateTime localDateTime;

}

不幸的是,从 Message 转换为 Transfer 传输对象时抛出异常。

Caused by: org.springframework.amqp.support.converter.MessageConversionException: failed to resolve class name. Class not found [com.kmb.bank.models.Transfer]
2018-11-29 20:47:01.615  WARN 13688 --- [cTaskExecutor-1] ingErrorHandler$DefaultExceptionStrategy : Fatal message conversion error; message rejected; it will be dropped or routed to a dead letter exchange, if so configured: (Body:'{"userAccountNumber":"1111444422221111","title":"123","recipientName":"123","recipientAccountNumber":"1234123412341234","amount":123.0,"localDateTime":{"nano":599669800,"year":2018,"monthValue":11,"dayOfMonth":29,"hour":20,"minute":47,"second":1,"month":"NOVEMBER","dayOfWeek":"THURSDAY","dayOfYear":333,"chronology":{"id":"ISO","calendarType":"iso8601"}}}' MessageProperties [headers={__TypeId__=com.kmb.bank.models.Transfer}, contentType=application/json, contentEncoding=UTF-8, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, redelivered=false, receivedExchange=bank, receivedRoutingKey=, deliveryTag=2, consumerTag=amq.ctag-sLNqW-_WhDWLWJk6MCQcjg, consumerQueue=kolejka])

整个消息日志: https://pastebin.com/raw/47Lq7dYD

最佳答案

您必须在接收 Jackson2JsonMessageConverter 的类型映射器中设置类型映射以映射到不同的类。

通常发送者会将其类映射到 token ,例如transfer 并且接收方会将其映射到它的 Transfer 版本。

或者,如果您使用 public void listen(Transfer transfer),并且您将转换器连接到监听器容器工厂,则框架将从参数推断类型。

如果它是一个 Spring Boot 应用程序,该连接将自动发生。

关于java - 无法将 Message 对象从 RabbitMQ 转换为 java 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53546545/

相关文章:

java - Java 局部变量何时符合 GC 条件?

java - 是否可以禁用 spring batch 的跳过限制?

spring - 如何配置 Spring 和 Apache Tiles 定义以从类路径解析 jsps

java - 对 Spring Rest API 的所有查询进行自定义验证

java - Android Spinner 包含很长的文本

java - 如何借助Session从Servlet通过Bean向JSP页面传递参数?

java - 提取字符串,包括字符串中的空格(java)

java - Apache Camel 与 RabbitMQ : messages in temp reply queue not being acked when autoAck=false on endpoint configuration

heroku - Celery在RabbitMQ上创建多个队列——非默认队列没有消费者

rabbitmq - 为什么在创建微服务时需要定义队列名称?