有没有办法访问RequestBody
(最好是它的映射形式)在 @ExceptionHandler
中使用 Spring WebFlux 和默认 Reactor Netty 的方法?
考虑以下示例:
@RestController
class TestRestController {
@PostMapping("/test")
Mono<TestBody> testPost(@RequestBody TestBody testBody) {
return Mono.error(new NullPointerException());
}
@ExceptionHandler(NullPointerException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
Mono<Void> handleNullPointerException(ServerWebExchange serverWebExchange) {
return Mono.empty();
}
}
在运行时 certain types 的附加实例可以注入(inject)
@ExceptionHandler
的方法签名,如上例所示 ServerWebExchange
.但是文档明确指出它不支持请求正文参数(请参阅 this section 中的注释)。使用 Servlet 堆栈,您可以注入(inject)
RequestContext
如 shown here . WebFlux 堆栈是否有等效或类似的方法?
最佳答案
是的,有一种方法,但不是很好看的方法。我们遇到了同样的问题,但在我们的例子中,我们想要访问响应式(Reactive)上下文,因为我们顽固地选择在这种响应式(Reactive)范式中使用 MDC,因此 MDC 依赖于该上下文。
在对异常处理程序和 Controller 建议进行了大量反复讨论之后,很明显无法在那里访问响应式(Reactive)上下文。
所以我们扩展了 AbstractErrorWebExceptionHandler .这里有一个 句柄(ServerWebExchange 交换,Throwable throwable)当您的应用程序出现错误时将调用的方法。好的部分是有 服务器WebExchange 您可以访问上下文,如: exchange.getAttributes().get(MDC_CONTEXT) 或 body 像: exchange.getRequest().getBody() .
这样就解决了我们的 MDC 问题,但不幸的是必须手动处理错误的映射。我记得我们投入了很多时间,当时这是最好的解决方案。干杯!
关于java - 如何在 Spring WebFlux @ExceptionHandler 中访问 RequestBody?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61199133/