繁体   English   中英

如何访问 Spring WebFlux @ExceptionHandler 中的 RequestBody?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM