以前の質問Spring Cloud Stream message from/to JSON conversion configurationに従い、説明どおりにストリームを構成しましたが、正しく動作させることはできません。
私のセットアップは次のとおりです。私は2つのアプリA
とB
. アプリ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)
ですか?