Search code examples
springfilterwebclient

Webclient ExchangeFilter not return a defined custom exception class


I have a problem when i do a webclient request (to a external api) and the response is 4xx ou 5xx code. The propose is handling that response and retrieve a response with a custom class

The webclient configuration is

    return WebClient.builder()
                    .baseUrl(baseUrl)
                    .defaultHeaders(httpHeaders -> {
                        httpHeaders.setBearerAuth("token");
                        httpHeaders.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
                    })
                    .filter(handlingFilter())
                    .build();
    
    
    }

handlingFilter.class

private static ExchangeFilterFunction handlingFilter() {
    return ExchangeFilterFunction.ofResponseProcessor(clientResponse -> {
        if(clientResponse.statusCode()!=null && (clientResponse.statusCode().is5xxServerError() || clientResponse.statusCode().is4xxClientError()) ) {
            return Mono.error(new MyException(clientResponse.statusCode().value(), clientResponse.statusCode().getReasonPhrase()));
        }else {
            return Mono.just(clientResponse);
        }
    });
}

MyExpcetion.class

public class MyException extends Exception{

    private int code;

    private String message;

    public MyException(String message) {
        super(message);
    }
}

But my client responses always give me a default format

{
  "timestamp": "x",
  "path": "x",
  "status": "x",
  "error": "x",
  "message": "x",
  "requestId": "x",
}

instead of

{
  "code": "x",
  "message": "x"
}

what's wrong ? thanks


Solution

  • To change your client's response (the response of your endpoint), you have to handle the exception properly. Take a look on Spring Documentation about Managing Exceptions

    Resuming: if you are using annotation endpoints, you have to create a @ExceptionHandler(MyException.class) on your Controller class or in a @RestControllerAdvice.

    If you are using Functional Endpoints, then configure WebExceptionHandler