ClientResponse (org.springframework.web.reactive.function.client.ClientResponse) menunjukkan inkonsistensi di seluruh kelas saat menggunakan WebClient

Sep 11 2020

Saya sudah mulai menggunakan WebClient (org.springframework.web.reactive.function.client.WebClient) untuk memanggil layanan istirahat. Saya memiliki 2 kelas, katakanlah Utility.java dan ServiceImpl.java. ServiceImpl.java adalah tempat saya menggunakan WebClient. Sebuah panggilan pos yang saya buat terlihat seperti -

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

(ClientResponse di atas adalah org.springframework.web.reactive.function.client.ClientResponse) (Saya menggunakan pertukaran instaed dari retrive karena saya ingin header serta kode status)

Sekarang mencoba untuk mengubah respon ini menjadi beberapa DTO - ResponseDTO.

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

Jadi myObj adalah objek dari kelas ResponseDTO.

Masalahnya adalah - ketika saya melakukan konversi 'respon menjadi ResponseDTO.java' di kelas utilitas saya, saya mendapatkan myObj = null. Tetapi jika saya melakukannya di ServiceImpl.java saya (tepat setelah memanggil API posting), itu mengembalikan tubuh yang tepat (objek ResponseDTO). Masalah yang sama terjadi bahkan jika saya melakukan konversi dan operasi pasca panggilan dalam dua metode berbeda di ServiceImpl.java. Apakah saya perlu mengkonfigurasi sesuatu di sini?

Jawaban

RushikeshMandage Sep 14 2020 at 07:34

Saya menemukan apa masalahnya. Setelah memanggil REST api, tubuh di respons jika dibilas setelah saya membacanya dari respons untuk pertama kalinya. Saya memiliki pernyataan Sysout di kelas implementasi layanan tempat saya membaca konten tubuh.

Rekomendasi: Baca isi body hanya sekali dan simpan dalam variabel. Gunakan dimanapun dibutuhkan.