ClientResponse (org.springframework.web.reactive.function.client.ClientResponse) montrant une incohérence entre les classes lors de l'utilisation de WebClient

Sep 11 2020

J'ai commencé à utiliser WebClient (org.springframework.web.reactive.function.client.WebClient) pour appeler les services de repos. J'ai 2 classes dites Utility.java et ServiceImpl.java. ServiceImpl.java est l'endroit où j'utilise WebClient. Un appel que je fais ressemble à -

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

(ClientResponse ci-dessus est org.springframework.web.reactive.function.client.ClientResponse) (J'utilise l'échange instaed de retrive parce que je veux des en-têtes ainsi que du code d'état)

Maintenant, essayez de convertir cette réponse en un DTO - ResponseDTO.

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

Donc myObj est un objet de la classe ResponseDTO.

Le problème est que lorsque j'effectue la conversion de «response into ResponseDTO.java» dans ma classe utilitaire, j'obtiens myObj = null. Mais si je le fais dans mon ServiceImpl.java (juste après avoir appelé post API), il renvoie le corps approprié (objet ResponseDTO). Le même problème se produit même si j'effectue l'opération de conversion et de post-appel dans deux méthodes différentes dans ServiceImpl.java. Dois-je configurer quelque chose ici?

Réponses

RushikeshMandage Sep 14 2020 at 07:34

J'ai compris quel était le problème. Après avoir appelé l'API REST, le corps de la réponse est vidé après l'avoir lu à partir de la réponse pour la première fois. J'avais une instruction Sysout dans la classe d'implémentation de service où je lisais le contenu du corps.

Recommandation: Lisez le contenu du corps une seule fois et stockez-le dans une variable. Utilisez-le partout où c'est nécessaire.