Spring Cloud Stream消息JSON转换无效

时间:2016-03-15 03:30:43

标签: java json spring-cloud-stream

我按照上一个问题Spring Cloud Stream message from/to JSON conversion configuration按照说明配置了流,但是,我无法使其正常工作。

我的设置如下。我有两个应用tabA。应用B使用输入频道A,输出one。应用two使用输入B。频道two配置了内容类型two

App A. Properties。

application/json

听众方法。

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

App B. Properties。

@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;
}

听众方法。

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

当我手动将带有正确JSON字符串的消息发送到频道@ServiceActivator(inputChannel = Sink.INPUT) public void handle(Dto dto) throws IOException { logger.info("DTO {}", dto); } 时,它会被正确处理并作为JSON消息发送到频道one(标题与上述问题中描述的完全相同) 。之后,应用B在频道two上收到该异常,并抛出异常:two

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

我错了吗?如何使用此类签名设置方法:Method handle(java.lang.String) cannot be found

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

如果使用@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