通过 Spring Cloud Stream of Message 在消费者端使用 pojo returns object 进行转换,字段为空

Conversion by Spring Cloud Stream of Message with pojo on consumer side returns object with null fields

这里是演示问题的代码片段。 在生产者方面:

    ProductModelDto dto = new ProductModelDto(1L, "name", "desc", 100.5);
    streamBridge.send(PRODUCTS_OUT, MessageBuilder.withPayload(dto).build());

消费者方面:

    @Bean
    public Consumer<Message<ProductModelDto>> productCreated() {
        return message -> {
            log.info("payload = {}", message.getPayload());
            log.info("payload class = {}", message.getPayload().getClass().getName());
            log.info("sourceData = {}", message.getHeaders().get("sourceData"));
        };
    }

输出:

payload = ProductModelDto(id=null, name=null, description=null, price=null)
payload class = ru.security.common.model.product.ProductModelDto
sourceData = (Body:'{"id":1,"name":"name","description":"desc","price":100.5}' MessageProperties [headers={}, timestamp=Tue Sep 07 11:13:02 MSK 2021, messageId=3840075f-1142-f94d-be37-7be950d73f54, contentType=application/json, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, redelivered=false, receivedExchange=product-service.product-created-or-changed, receivedRoutingKey=product-service.product-created-or-changed, deliveryTag=1, consumerTag=amq.ctag-3i5ECkRTPs5_O5ZW5af-MA, consumerQueue=product-service.product-created-or-changed.some-group4])

我希望收到生产者发送的负载。但结果有效载荷是 ProductModelDto(id=null, name=null, description=null, price=null)。 我知道 spring 如果我使用

会自动将消息转换为 pojo
Consumer<ProductModelDto> productCreated()

但我需要

Consumer<Message<ProductModelDto>> productCreated()

从消息中获取 Headers。有什么建议我错过了一些配置吗?

我创建了示例项目,发现此问题在 spring-cloud-starter-stream-rabbit 的 3.0.11.RELEASE 版本中重现。在版本 3.1.4 或 3.0.10.RELEASE 中我没有看到这个问题。 https://github.com/serjteplov/demo-gitter-scs1.git