Spring Cloud Stream消息JSON转换无效

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Cloud Stream消息JSON转换无效相关的知识,希望对你有一定的参考价值。

我按照我之前的问题Spring Cloud Stream message from/to JSON conversion configuration和配置流进行了描述,但是,我无法使其正常工作。

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

App 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时,它会被正确处理并发送到通道two作为JSON消息(标题与上述问题中描述的完全相同)。在那之后,应用程序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

以上是关于Spring Cloud Stream消息JSON转换无效的主要内容,如果未能解决你的问题,请参考以下文章

spring-cloud-stream 请求-回复消息模式

Spring Cloud 系列之 Stream 消息驱动

Spring cloud stream消息分区

Spring cloud stream消息分组

spring cloud 2.x版本 Spring Cloud Stream消息驱动组件基础教程(kafaka篇)

十五Spring Cloud Stream 消息驱动