ClientResponse(org.springframework.web.reactive.function.client.ClientResponse)は、WebClientの使用中にクラス間で不整合を示しています

Sep 11 2020

残りのサービスを呼び出すためにWebClient(org.springframework.web.reactive.function.client.WebClient)を使い始めました。Utility.javaとServiceImpl.javaという2つのクラスがあります。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で(post APIを呼び出した直後に)実行すると、適切な本体(ResponseDTOオブジェクト)が返されます。ServiceImpl.javaの2つの異なるメソッドで変換と呼び出し後の操作を実行しても、同じ問題が発生します。ここで何かを構成する必要がありますか?

回答

RushikeshMandage Sep 14 2020 at 07:34

私は何が問題なのか理解しました。REST apiを呼び出した後、応答から初めて読み取った後にフラッシュされた場合は、応答の本文。本文の内容を読んでいたサービス実装クラスにSysoutステートメントがありました。

推奨事項:本文の内容を1回だけ読み取り、変数に格納します。必要に応じて使用してください。