HTTP Response Exception Handling in Spring 5 Reactive

后端 未结 2 1853
一生所求
一生所求 2021-02-19 21:11

I\'m developing some reactive microservices using Spring Boot 2 and Spring 5 with WebFlux reactive starter.

I\'m facing the following problem: I want to handle all HTTP

相关标签:
2条回答
  • 2021-02-19 21:46

    I think what you are looking for is WebFluxResponseStatusExceptionHandler the check this for reference.

    In the WebHandler API, a WebExceptionHandler can be used to to handle exceptions from the chain of WebFilter's and the target WebHandler. When using the WebFlux Config, registering a WebExceptionHandler is as simple as declaring it as a Spring bean, and optionally expressing precedence via @Order on the bean declaration or by implementing Ordered.

    This example may help, have not tried it myself.

    @Component
    @Order(-2)
    class RestWebExceptionHandler implements WebExceptionHandler{
    
        @Override
        public Mono<Void> handle(ServerWebExchange exchange, Throwable ex) {
            if (ex instanceof PostNotFoundException) {
                exchange.getResponse().setStatusCode(HttpStatus.NOT_FOUND);
    
                // marks the response as complete and forbids writing to it
                return exchange.getResponse().setComplete();
            }
            return Mono.error(ex);
        }
    }
    
    class PostNotFoundException extends RuntimeException {
        PostNotFoundException(String id) {
            super("Post:" + id + " is not found.");
        }
    }
    
    0 讨论(0)
  • 2021-02-19 21:54

    This can be addressed in two independent parts.

    How to convert HTTP 404 responses received by WebClient into custom exceptions

    When using WebClient, you can receive HTTP 404 responses from remote services. By default, all 4xx and 5xx client responses will be turned into WebClientResponseException. So you can directly handle those exceptions in your WebFlux app.

    If you'd like to turn only 404 responses into custom exceptions, you can do the following:

    WebClient webClient = //...
    webClient.get().uri("/persons/1")
      .retrieve()
      .onStatus(httpStatus -> HttpStatus.NOT_FOUND.equals(httpStatus),
                            clientResponse -> Mono.error(new MyCustomException()))
      .bodyToMono(...);
    

    This is obviously done on a per client call basis.

    You can achieve the same in a more reusable way with an ExchangeFilterFunction that you can set once and for all on a WebClient instance like this:

    WebClient.builder().filter(myExchangeFilterFunction)...
    

    How to handle custom exceptions in WebFlux apps

    With Spring WebFlux with annotations, you can handle exceptions with methods annotated with @ExceptionHandler (see Spring Framework reference documentation).

    Note: using a WebExceptionHandler is possible, but it's quite low level as you'll have no high-level support there: you'll need to manually write the response with buffers without any support for serialization.

    0 讨论(0)
提交回复
热议问题