Spring Integration:如何在WebFlux中通过AbstractRequestHandlerAdvice检查HTTP响应?
解决方案
当使用webflux:outbound-gateway时,callback.execute()返回的是Mono<Message<?>>(具体类型为MonoMapFuseable),你可以通过Reactor的副作用操作符在不消费数据流的前提下记录返回的payload,核心思路是利用doOnNext或doOnSuccess添加日志逻辑,同时保持原Mono的流转。
修改你的MyLogger通知处理器代码如下:
public class MyLogger extends AbstractRequestHandlerAdvice { // ... @Override protected Object doInvoke(ExecutionCallback callback, Object target, Message<?> message) { // ... 调用前日志记录 ... Object result = callback.execute(); // 针对响应式类型(Mono)添加日志逻辑 if (result instanceof Mono) { return ((Mono<?>) result) .doOnNext(responseMsg -> { if (responseMsg instanceof Message) { // 读取并记录payload Object payload = ((Message<?>) responseMsg).getPayload(); // ... 调用后日志记录,比如打印payload信息 ... System.out.println("Response payload: " + payload); } }); } else { // 兼容非响应式场景的原有日志逻辑 // ... 调用后日志记录 ... return result; } } }
关键说明
doOnNext是Reactor的副作用操作,仅当Mono成功发射数据时执行日志逻辑,不会触发订阅(消费),订阅动作由下游的Spring Integration组件处理,完全保留响应式流程的异步非阻塞特性。- 禁止调用
block()或subscribe(),这些方法会强制消费Mono,破坏响应式模型,引入同步阻塞。 - 代码中保留了对非响应式返回值的兼容处理,确保在混合场景下依然可用。
内容的提问来源于stack exchange,提问作者al.truisme
相关产品推荐
相关产品推荐

