Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to catch ConnectionException in Spring WebClient?

I have the following error handling in RestTemplate:

try {
   restTemplate.postForObject(..);
} catch (ResourceAccessException e) {
   throw new CustomException("host is down");
}

Question: how can I achieve the same with spring WebClient?

try {
   webClient.post()...block();
} catch (Exception e) {
    //cannot check due to package private access
    //if (e instanceof Exceptions.ReactiveException)
    if (e.getCause() instanceof java.net.ConnectException) {
         throw new CustomException("host is down");
    }
}

Problem: I cannot directly catch ConnectionException because it is wrapped inside the ReactiveException. Could I do better than applying multiple instanceof checks for any real underlying exceptions?

like image 401
membersound Avatar asked Aug 12 '19 09:08

membersound


1 Answers

you'd handle the error reactively, using onErrorMap with the check you're doing in the predicate (see https://projectreactor.io/docs/core/release/api/reactor/core/publisher/Mono.html#onErrorMap-java.lang.Class-java.util.function.Function-)

Note: Didn't check whether this compiles, and you can also replace the isAssignableFrom check with instanceof, if you like.

WebClient.post().....onErrorMap(t -> t.getCause.isAssignableFrom(ConnectException.class), t -> new CustomException("host is down"));
like image 99
Frischling Avatar answered Nov 05 '22 21:11

Frischling