![](/img/trans.png)
[英]Spring boot @RequestBody with @Valid- ExceptionHandler for MethodArgumentNotValidException
[英]How to access the RequestBody in a Spring WebFlux @ExceptionHandler?
有没有办法使用 Spring WebFlux 和默认的 Reactor Netty 在@ExceptionHandler
方法中访问RequestBody
(最好是映射形式)?
考虑以下示例:
@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();
}
}
在运行时,可以将某些类型的其他实例注入到@ExceptionHandler
的方法签名中,如上面的ServerWebExchange
示例所示。 但是文档清楚地表明 state 它不支持请求正文 arguments(请参阅本节中的注释)。
使用 Servlet 堆栈,您可以注入RequestContext
,如下所示。 WebFlux 堆栈是否有等效或类似的方法?
是的,有一种方法,但不是一个非常好看的方法。 我们遇到了同样的问题,但在我们的例子中,我们想要访问响应式上下文,因为我们顽固地选择在这种响应式范例中使用 MDC,所以 MDC 依赖于那个上下文。
在多次使用异常处理程序和 controller 建议后,很明显无法访问响应式上下文。
所以我们扩展了AbstractErrorWebExceptionHandler 。 这里有一个handle(ServerWebExchange exchange, Throwable throwable)方法,当您的应用程序出错时将调用该方法。 好的部分是有ServerWebExchange ,您可以访问上下文,例如: exchange.getAttributes().get(MDC_CONTEXT)或正文: exchange.getRequest().getBody() 。
这样就解决了我们的 MDC 问题,但不幸的是,错误的映射必须手动处理。 我记得我们投入了很多时间,在当时,这是最好的解决方案。 干杯!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.