java - 如何在 Spring WebFlux @ExceptionHandler 中访问 RequestBody?

标签 java spring spring-boot spring-webflux

有没有办法访问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) RequestContextshown 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/

相关文章:

java - Java:WAITING boolean 值变为真实

java - 如何使用selenium处理 session 超时

java - 将 spring boot 应用程序拆分为多个 Web 应用程序

JavaFX Scene Builder - 使用变量值

java - Java中远程连接的连接池

java - 通过 https 给定 IP 地址的 Spring Boot 白名单

java - 使用 spring @Caching 时缓存层的顺序是什么?

java - Spring Boot 将文本/javascript 序列化为 JSON

java - Spring Boot 应用程序启动失败,因为在 POM.XML 中具有 mysql 和 mongo 依赖项

java - 在tomcat中部署后无法访问spring boot应用程序