Java 17: Issues with Custom Exception Handling in Spring Boot REST API when using WebClient
I'm confused about Hey everyone, I'm running into an issue that's driving me crazy. I've been struggling with this for a few days now and could really use some help... I'm developing a REST API using Spring Boot 2.6 with Java 17, and I've encountered a peculiar issue when handling custom exceptions thrown during asynchronous calls made via WebClient. My expectation is to catch these exceptions and return a meaningful HTTP response, but it seems to be bypassing my error handling logic. I've set up a WebClient instance to make asynchronous calls to another service. Hereโs a simplified version of my code: ```java @Service public class MyService { private final WebClient webClient; public MyService(WebClient.Builder webClientBuilder) { this.webClient = webClientBuilder.baseUrl("http://external-service").build(); } public Mono<MyResponse> getData() { return webClient.get() .uri("/data") .retrieve() .bodyToMono(MyResponse.class) .doOnError(MyCustomException.class, ex -> { // Custom error handling logic throw new MyCustomException("Custom error occurred", ex); }); } } ``` But when the external service returns an error (e.g., 404 or 500), my `doOnError` block isn't being triggered as expected. Instead, I'm seeing a generic `WebClientResponseException` being thrown, which isn't being caught by my application-level exception handler. Hereโs the relevant part of my controller: ```java @RestController public class MyController { private final MyService myService; public MyController(MyService myService) { this.myService = myService; } @GetMapping("/fetch") public ResponseEntity<MyResponse> fetchData() { return myService.getData() .map(response -> ResponseEntity.ok(response)) .onErrorResume(MyCustomException.class, ex -> { // Handle MyCustomException return Mono.just(ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body(new ErrorResponse(ex.getMessage()))); }) .block(); } } ``` I've also tried using `retry()` and `onStatus()` methods in the WebClient, but no luck. The only way I can seem to catch the error is by wrapping the entire call in a `try-catch` block, which feels like a hack. The error messages that I see in the logs seem to indicate that the error is being handled internally, and I donโt get a chance to intercept it. Any insight into how to properly catch these exceptions with the WebClient in a way that allows for clean error handling would be greatly appreciated! For context: I'm using Java on Windows. Any ideas what could be causing this? I'm working on a service that needs to handle this. My team is using Java for this REST API.