0

I have implemented the error handling in a filter that looks like this:

public Mono<ClientResponse> filter(ClientRequest request, ExchangeFunction next) {
  URI url = request.url();
  HttpMethod method = request.method();
  return next.exchange(request).flatMap(response -> {
    if (response.statusCode().isError()) {
      return response.bodyToMono(String.class).flatMap(responseBody -> {
        Optional<Exception> exception = errorResponseHandler.handleError(method, response.statusCode(), url, responseBody);
        if (exception.isPresent()) {
          return Mono.error(exception.get());
        } else {
          // fallback
          return Mono.error(new UnsupportedOperationException("The fallback functionality is still missing"));
        }
      });
    } else {
      return Mono.just(response);
    }
  });
}

This should work fine in the case where the response comes with a body as then the response.bodyToMono(String.class).flatMap(...) is executed. However when the body is empty nothing happens, but what I want is to also deal with the error. It is my understanding that I would do this something like this;

response.bodyToMono(String.class).flatMap(...)
.switchIfEmpty(Mono.error(new UnsupportedOperationException("The body was empty")));

This does not work as the expected type to be returned is Mono instead of Mono.

How can I achieve the handling of errors with and without response body, which is needed to construct to correct exception?

hotzst
  • 7,238
  • 9
  • 41
  • 64

1 Answers1

0

This question brought me onto the right track: The switchIfEmpty invocation has to come before the flatMap. As there is no body, flatMap is not executed and neither is anything after, therefore the switchIfEmpty has to come first:

public Mono<ClientResponse> filter(ClientRequest request, ExchangeFunction next) {
  URI url = request.url();
  HttpMethod method = request.method();
  return next.exchange(request).flatMap(response -> {
    if (response.statusCode().isError()) {
      return response.bodyToMono(String.class)
        .switchIfEmpty(Mono.error(new UnsupportedOperationException("The body was empty")));
        .flatMap(responseBody -> {
          Optional<Exception> exception = errorResponseHandler.handleError(method, response.statusCode(), url, responseBody);
          if (exception.isPresent()) {
            return Mono.error(exception.get());
          } else {
            // fallback
            return Mono.error(new UnsupportedOperationException("The fallback functionality is still missing"));
          }
        });
    } else {
      return Mono.just(response);
    }
  });
}
hotzst
  • 7,238
  • 9
  • 41
  • 64