es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Formas de manejar excepciones como WebClientRequestException debido a la indisponibilidad del servicio para todas las llamadas desde una instancia de WebClient en lugar de manera individual.

Como sugiere el título, estoy utilizando Spring WebClient para invocar una API externa y procesar la respuesta. He agregado una función de filtro de intercambio (ExchangeFilterFunction) para manejar la respuesta basada en el código de estado devuelto por el servidor, algo así como lo siguiente.

ExchangeFilterFunction responseProcessor() {
    return ExchangeFilterFunction.ofResponseProcessor(response -> {
        if (response.statusCode().isError()) {
            return Mono.error(new RuntimeException("Error de WebClient"));
        }
        return Mono.just(response);
    });
}

Ahora, esto funciona bien con los servicios que devuelven una respuesta para la solicitud cuando están activos. Pero cuando el servicio está caído, la solicitud falla con WebClientRequestException, lo cual está bien, pero el error lanzado no es manejado por el responseProcessor y se propaga.

Sé que el error se puede manejar en la llamada de WebClient utilizando alguno de los métodos onErrorXXX. Pero si usamos esa instancia de WebClient para hacer muchas llamadas en diferentes partes del código, el manejo parece ineficiente. Por lo tanto, me gustaría saber si hay una forma de manejar este error para todas las llamadas realizadas por esa instancia de WebClient en lugar de manejarlo en cada una de las invocaciones individuales. Algo similar a lo que hace el responseProcessor para todas las respuestas.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma de manejar este error para todas las llamadas realizadas por una instancia de WebClient. Puedes agregar un ExchangeFilterFunction para manejar los errores usando ExchangeFilterFunctions.ofErrorConsumer(). Aquí tienes un ejemplo:

    ExchangeFilterFunction errorProcessor() {
        return ExchangeFilterFunctions.ofErrorConsumer(throwable -> {
            // Maneja la excepción WebClientRequestException aquí.
            // Puedes registrarla, lanzar una excepción personalizada o devolver un valor predeterminado.
    
            // Ejemplo: Lanza una excepción personalizada
            if (throwable instanceof WebClientRequestException) {
                throw new MyCustomException("Error de WebClient", throwable);
            }
        });
    }
    

    Luego puedes agregar este filtro a tu instancia de WebClient:

    WebClient webClient = WebClient.builder()
            .baseUrl("https://example.com/api")
            .filter(responseProcessor())
            .filter(errorProcessor())
            .build();
    

    Ahora cualquier solicitud realizada a través de esta instancia de WebClient tendrá automáticamente la lógica de manejo de errores aplicada.

Comments are closed.