Spring 云流消息 JSON 转换无效

Spring Cloud Stream message JSON conversion is not working

我按照我之前的问题 并按照描述配置了流,但是,我无法使其正常工作。

我的设置如下。我有两个应用 AB。应用程序 A 使用输入通道 one,输出通道 two。应用 B 使用输入 two。频道 two 配置了内容类型 application/json

应用程序 A. 属性。

spring.cloud.stream.bindings.input.destination=one
spring.cloud.stream.bindings.input.group=default

spring.cloud.stream.bindings.output.destination=two
spring.cloud.stream.bindings.output.content-type=application/json

侦听器方法。

@ServiceActivator(inputChannel = Processor.INPUT, outputChannel = Processor.OUTPUT)
public Dto handle(byte[] payload) throws IOException {
    final Dto dto = new ObjectMapper().readValue(payload, Dto.class);
    logger.info("{}", dto);
    dto.setId(dto.getId() + 1000);
    return dto;
}

应用程序 B. 属性。

spring.cloud.stream.bindings.input.destination=two
spring.cloud.stream.bindings.input.group=default
spring.cloud.stream.bindings.input.content-type=application/json

侦听器方法。

@ServiceActivator(inputChannel = Sink.INPUT)
public void handle(Dto dto) throws IOException {
    logger.info("DTO {}", dto);
}

当我手动将带有正确 JSON 字符串的消息发送到频道 one 时,它被正确处理并作为 JSON 消息发送到频道 two(headers 与上述问题中描述的完全相同)。之后,应用程序 B 在通道 two 上接收到它并抛出异常:Method handle(java.lang.String) cannot be found

当然,当我创建这两个方法时,将 Dto 和 String 作为输入处理,它可以工作,但总是调用 String 方法并且必须自己反序列化有效负载。

我是不是哪里弄错了?如何使用这样的签名设置方法:public Dto handle(Dto incoming)?

您应该将 AppB 输入的内容类型声明更改为

application/x-java-object;type=your.package.Dto.

正如您在问题中指定的那样,您当然只接受 JSON 个字符串。

如果使用@StreamListener,则不必使用回答方式,但必须删除(不要指定任何内容,否则它将是一个json字符串):

spring.cloud.stream.bindings.input.content-type=application/json

来自 AppB 属性

来源(旧文档但仍然有效): https://docs.spring.io/spring-cloud-stream/docs/Brooklyn.RELEASE/reference/html/contenttypemanagement.html#__literal_streamlistener_literal_and_message_conversion