3

以前の質問Spring Cloud Stream message from/to JSON conversion configurationに従い、説明どおりにストリームを構成しましたが、正しく動作させることはできません。

私のセットアップは次のとおりです。私は2つのアプリAB. アプリAは入力チャネルone、出力を使用しますtwo。アプリBは input を使用しますtwo。チャネルtwoは content type で構成されています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 文字列を含むメッセージを channel に手動で送信すると、メッセージoneは正しく処理さtwoれ、JSON メッセージとしてチャネルに送信されます (ヘッダーは上記の質問で説明したものとまったく同じです)。その後、twoアプリ B によってチャネルで受信され、例外がスローされます。Method handle(java.lang.String) cannot be found

もちろん、Dto と String を入力として処理する両方のメソッドを作成すると機能しますが、常に String メソッドが呼び出され、自分でペイロードを逆シリアル化する必要があります。

私はどこか間違っていますか?このような署名を使用してメソッドをセットアップするにはどうすればよいpublic Dto handle(Dto incoming)ですか?

4

2 に答える 2

2

AppB の入力の content-type 宣言を次のように変更する必要があります。

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

質問で指定されているように、もちろん JSON 文字列のみを受け入れます。

于 2016-03-23T10:33:53.550 に答える