Can';t将消息对象从RabbitMQ转换为java类
我创建了RabbitListener以从RabbitMQ队列获取消息 我的rabbitMQ消息:Can';t将消息对象从RabbitMQ转换为java类,java,spring,rabbitmq,spring-amqp,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 {"user
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配置:
@豆子
公共对象映射器对象映射器(){
返回新的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;
}
不幸的是,从消息转换到传输对象时引发异常
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])
整个消息日志:
您必须在接收
Jackson2JsonMessageConverter
的类型映射器中设置类型映射,以映射到不同的类
通常,发送方会将其类映射到令牌,例如传输
,接收方会将其映射到其版本的传输
或者,如果您使用public void listen(Transfer-Transfer)
,并且将转换器连接到侦听器容器工厂,则框架将从参数推断类型
如果是Spring引导应用程序,那么这种连接将自动进行 你能提供更详细的日志(stacktrace)吗?我认为这是一个问题,它是不同的传输类,package与TypeId不同,但我不知道解决方案。你必须在接收
jackson2JsonMessageConverter
的类型映射器中设置类型映射,以映射到不同的类。或者,如果使用public void listen(Transfer-Transfer)
将转换器连接到侦听器容器工厂,则框架将根据参数推断类型。如果它是一个启动应用程序,这将自动发生。这有点帮助,但现在我发现与LocalDateTime相关的错误:由:com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法构造java.time.LocalDateTime
的实例(不存在像默认构造一样的创建者):无法从对象值(无委托或基于属性的创建者)反序列化您需要将自定义Jackson反序列化器应用于ObjectMapper-以下是一个有答案的问题:
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])