Как получить доступ к RequestBody в Spring WebFlux @ExceptionHandler? - PullRequest
2 голосов
/ 14 апреля 2020

Есть ли способ получить доступ к 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();
  }

}

Во время выполнения дополнительные экземпляры определенных типов могут быть внедрены в сигнатуру метода @ExceptionHandler, как показано в приведенном выше примере с ServerWebExchange. Но в документах четко указано, что он не поддерживает аргументы тела запроса (см. Примечание в в этом разделе ).

Используя стек сервлетов, вы можете ввести RequestContext как показано здесь . Существует ли аналогичный или аналогичный подход для стека WebFlux?

1 Ответ

0 голосов
/ 14 апреля 2020

Да, есть способ, но не очень красивый. У нас был вид той же проблемы, но в нашем случае мы хотели бы иметь доступ на реактивном контексте, так как мы упорно решили использовать MD C в этом реактивным парадигме, поэтому MD C полагаться на этот контекст.

После долгих обсуждений с обработчиками исключений и советами контроллеров стало совершенно очевидно, что реактивный контекст не может быть доступен там.

Итак, мы расширили AbstractErrorWebExceptionHandler . Здесь есть дескриптор (обмен ServerWebExchange, Throwable throwable) метод, который будет вызываться, когда ваше приложение имеет ошибку. Хорошей частью является то, что существует ServerWebExchange , и вы можете получить доступ к контексту, например: exchange.getAttributes (). Get (MDC_CONTEXT) или к телу, например: exchange.getRequest () .getBody () .

Так что это решило нашу проблему с MD C, но, к сожалению, отображение ошибок пришлось обрабатывать вручную. Я помню, что мы потратили много времени, и в то время это было лучшее решение. Ура!

...