Saltar al contenido

Manejo de excepciones de respuesta HTTP en Spring 5 Reactive

Hacemos una revisión profunda cada uno de los posts de nuestro espacio con la meta de mostrarte en todo momento la información con la mayor veracidad y actual.

Solución:

Esto se puede abordar en dos partes independientes.

Cómo convertir respuestas HTTP 404 recibidas por WebClient en excepciones personalizadas

Cuando usas WebClient, puede recibir respuestas HTTP 404 de servicios remotos. Por defecto, todos 4xx y 5xx las respuestas de los clientes se convertirán en WebClientResponseException. Entonces puede manejar directamente esas excepciones en su aplicación WebFlux.

Si desea convertir solo las respuestas 404 en excepciones personalizadas, puede hacer lo siguiente:

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

Obviamente, esto se hace por llamada de cliente.

Puede lograr lo mismo de una manera más reutilizable con un ExchangeFilterFunction que puedes configurar de una vez por todas en un WebClient instancia como esta:

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

Cómo manejar excepciones personalizadas en aplicaciones WebFlux

Con Spring WebFlux con anotaciones, puede manejar excepciones con métodos anotados con @ExceptionHandler (consulte la documentación de referencia de Spring Framework).

Nota: utilizando un WebExceptionHandler es posible, pero es un nivel bastante bajo ya que no tendrá soporte de alto nivel allí: deberá escribir manualmente la respuesta con búferes sin soporte para serialización.

creo que lo que buscas es WebFluxResponseStatusExceptionHandler el cheque esto como referencia.

En la API de WebHandler, se puede usar un WebExceptionHandler para controlar las excepciones de la cadena de WebFilter y el WebHandler de destino. Al usar WebFlux Config, registrar un WebExceptionHandler es tan simple como declararlo como un bean Spring y, opcionalmente, expresar la precedencia a través de @Order en la declaración del bean o implementar Ordered.

Este ejemplo puede ayudar, no lo he probado yo mismo.

@Component
@Order(-2)
class RestWebExceptionHandler implements WebExceptionHandler

    @Override
    public Mono 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.");
    

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *