ClientResponse (org.springframework.web.reactive.function.client.ClientResponse), показывающий несогласованность между классами при использовании WebClient

Sep 11 2020

Я начал использовать WebClient (org.springframework.web.reactive.function.client.WebClient) для вызова сервисов отдыха. У меня есть 2 класса: Utility.java и ServiceImpl.java. ServiceImpl.java - это место, где я использую WebClient. Почтовый звонок, который я делаю, выглядит так -

ClientResponse response = webClient.post()
            .uri(path)
            .body(Mono.just(inputDTO),InputDTO.class)
            .exchange()
            .block();

(ClientResponse выше - это org.springframework.web.reactive.function.client.ClientResponse) (Я использую обмен с возвратом, потому что мне нужны заголовки, а также код состояния)

Теперь пытаюсь преобразовать этот ответ в какой-нибудь DTO - ResponseDTO.

Mono<ResponseEntity<ResponseDTO>> mono = response.toEntity(ResponseDTO.class);
        ResponseEntity<ResponseDTO> resEntity = mono.block();
        ResponseDTO myObj = resEntity.getBody();

Итак, myObj - это объект класса ResponseDTO.

Проблема в том, что когда я выполняю преобразование ответа в ResponseDTO.java в моем служебном классе, я получаю myObj = null. Но если я сделаю это в своем ServiceImpl.java (сразу после вызова API сообщений), он вернет правильное тело (объект ResponseDTO). Та же проблема возникает, даже если я выполняю операцию преобразования и пост-вызова двумя разными методами в ServiceImpl.java. Мне тут что-то настраивать?

Ответы

RushikeshMandage Sep 14 2020 at 07:34

Я понял, в чем проблема. После вызова REST api тело ответа сбрасывается после того, как я впервые прочитал его из ответа. У меня был оператор Sysout в классе реализации службы, где я читал содержимое тела.

Рекомендация: прочтите содержимое тела только один раз и сохраните его в переменной. Используйте его везде, где требуется.