在学习Spring Cloud Stream,用Stream传输对象时,碰到了Cannot convert from [[B] to [com.zx.server.dto.OrderDTO] for GenericMessage 这个异常,但是在之前传输字符串就正常。而且把消费者的参数类型设置为String也正常,一旦设置为OrderDTO就会报错。
@GetMapping("/sendMessage")
public void process() {
OrderDTO orderDTO = new OrderDTO();
orderDTO.setOrderId("123456");
client.output().send(MessageBuilder.withPayload(orderDTO).build());
}
@StreamListener(StreamClient.INPUT)
public void process(OrderDTO message) {
log.info("StreamReceiver: {}", message);
}
经过测试发现在生产者发送这边没有问题,在消费者接收时报的错。初步判断为接收类型有问题,一开始想到了序列化,但是序列化以后仍然有问题,后来在yml配置中找到了问题
spring:
cloud:
stream:
bindings:
InputMessage:
destination: myMessage
contentType: text/plain
OutputMessage:
destination: myMessage
contentType: text/plain
原因是设置了Queue的contentType,规定了text,所以不论任何数据都会默认为text而导致接收类型报错。
出现这个问题的原因是因为现在的版本@Input和@Output重名会报错,所以必须给它们设置destination,后边的contentType是抄上那篇博客的......