ClientResponse (org.springframework.web.reactive.function.client.ClientResponse) mostrando inconsistência entre as classes ao usar WebClient

Sep 11 2020

Comecei a usar WebClient (org.springframework.web.reactive.function.client.WebClient) para chamar serviços de descanso. Eu tenho 2 classes que dizem Utility.java e ServiceImpl.java. ServiceImpl.java é onde uso WebClient. Uma pós-chamada que estou fazendo parece -

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

(ClientResponse acima é org.springframework.web.reactive.function.client.ClientResponse) (Estou usando troca instaurada de retrive porque quero cabeçalhos, bem como código de status)

Agora tentando converter esta resposta em algum DTO - ResponseDTO.

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

Portanto, myObj é um objeto da classe ResponseDTO.

O problema é - quando eu executo a conversão de 'resposta em ResponseDTO.java' na minha classe de utilitário, obtenho myObj = null. Mas se eu fizer isso no meu ServiceImpl.java (logo após chamar a API post), ele retornará o corpo adequado (objeto ResponseDTO). O mesmo problema ocorre mesmo se eu executar a operação de conversão e pós-chamada em dois métodos diferentes no ServiceImpl.java. Eu preciso configurar algo aqui?

Respostas

RushikeshMandage Sep 14 2020 at 07:34

Eu descobri qual era o problema. Depois de chamar a api REST, o corpo na resposta é liberado depois que eu o li da resposta pela primeira vez. Eu tinha uma instrução Sysout na aula de implementação de serviço onde estava lendo o conteúdo do corpo.

Recomendação: Leia o conteúdo do corpo apenas uma vez e armazene-o em uma variável. Use-o sempre que necessário.