将 Mono 作为参数的好处?

Benefits of having Mono as parameter?

在 HTTP 端点处理程序方法中使用 Mono 作为参数有什么好处?

假设我有这个代码:

public Mono<ResponseDto> handle (@RequestBody Mono<RequestBodyDto> requestBody) {
   return requestBody
        .flatMap(service::doSomething)
        .doOnError(%printError with requestBody%);
}

我想在错误日志中记录请求,但我无法在错误处理 lambda 中访问它。我无法调用 requestBody.block()。

为什么我不能这样做:

public Mono<ResponseDto> handle (@RequestBody RequestBodyDto requestBody) {
   return Mono.just(requestBody)
        .flatMap(service::doSomething)
        .doOnError(%printError with requestBody%);
}

?

在这种情况下,我可以通过方法参数访问 requestBody。

反应式编程迎合高性能异步数据流。如果您只是为了记录目的而序列化有效负载,则会破坏此优化并冒内存泄漏的风险。不过,您可以登录 meta-data。

如果您仍然需要记录请求或响应主体,您可以考虑使用 WebFilter,请参见此处的示例: