ClientResponse (org.springframework.web.reactive.function.client.ClientResponse) che mostra incoerenze tra le classi durante l'utilizzo di WebClient

Sep 11 2020

Ho iniziato a utilizzare WebClient (org.springframework.web.reactive.function.client.WebClient) per chiamare i servizi di riposo. Ho 2 classi diciamo Utility.java e ServiceImpl.java. ServiceImpl.java è dove utilizzo WebClient. Una chiamata che sto facendo sembra:

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

(ClientResponse sopra è org.springframework.web.reactive.function.client.ClientResponse) (Sto usando exchange instaed of retive perché voglio intestazioni e codice di stato)

Ora provando a convertire questa risposta in qualche DTO - ResponseDTO.

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

Quindi myObj è un oggetto della classe ResponseDTO.

Il problema è: quando eseguo la conversione di "response in ResponseDTO.java" nella mia classe di utilità, ottengo myObj = null. Ma se lo faccio nel mio ServiceImpl.java (subito dopo aver chiamato l'API del post), restituisce il corpo corretto (oggetto ResponseDTO). Lo stesso problema si verifica anche se eseguo la conversione e l'operazione di post-chiamata in due metodi diversi in ServiceImpl.java. Devo configurare qualcosa qui?

Risposte

RushikeshMandage Sep 14 2020 at 07:34

Ho capito qual era il problema. Dopo aver chiamato l'API REST, il corpo della risposta viene eliminato dopo averlo letto dalla risposta per la prima volta. Avevo un'istruzione Sysout nella classe di implementazione del servizio in cui stavo leggendo il contenuto del corpo.

Raccomandazione: leggere il contenuto del corpo solo una volta e memorizzarlo in una variabile. Usalo dove richiesto.