Ошибка выброса Spring WebClient на основе тела ответа

Я использую Spring WebClient для вызова REST API. Я хочу выдать ошибку на основе ответа. Например, если есть ошибка (400) с телом

{"error": "error message1 "}

то я хочу выдать ошибку с сообщением об ошибке1. Таким же образом, если есть ошибка (400) с телом

{"error_code": "100020"}

то я хочу выдать ошибку с error_cde 100020. Я хочу сделать это неблокирующим способом.

public Mono<Response> webclient1(...) {

 webClient.post().uri(createUserUri).header(CONTENT_TYPE, APPLICATION_JSON)
                .body(Mono.just(request), Request.class).retrieve()
                .onStatus(HttpStatus::isError, clientResponse -> {
        
                 //Error Handling
                
                }).bodyToMono(Response.class);
}

person salman irfan khandu    schedule 04.03.2021    source источник


Ответы (1)


Тело из ClientResponse следует извлекать реактивным способом (javadoc) и лямбда в onStatus методе должны возвращать другой Mono (javadoc). Подводя итог, взгляните на пример ниже

onStatus(HttpStatus::isError, response -> response
    .bodyToMono(Map.class)
    .flatMap(body -> {
        var message = body.toString(); // here you should probably use some JSON mapper
        return Mono.error(new Exception(message));
    })
);
person sawim    schedule 04.03.2021
comment
Он работает нормально, спасибо за помощь - person salman irfan khandu; 04.03.2021