ClientResponse (org.springframework.web.reactive.function.client.ClientResponse) zeigt Inkonsistenzen zwischen den Klassen bei Verwendung von WebClient
Ich habe begonnen, WebClient (org.springframework.web.reactive.function.client.WebClient) zum Aufrufen von Restdiensten zu verwenden. Ich habe 2 Klassen, sagen Utility.java und ServiceImpl.java. In ServiceImpl.java verwende ich WebClient. Ein Postanruf, den ich mache, sieht aus wie -
ClientResponse response = webClient.post()
.uri(path)
.body(Mono.just(inputDTO),InputDTO.class)
.exchange()
.block();
(ClientResponse oben ist org.springframework.web.reactive.function.client.ClientResponse) (Ich verwende Exchange anstelle von Retrive, da ich sowohl Header als auch Statuscode möchte.)
Versuchen Sie nun, diese Antwort in ein DTO - ResponseDTO umzuwandeln.
Mono<ResponseEntity<ResponseDTO>> mono = response.toEntity(ResponseDTO.class);
ResponseEntity<ResponseDTO> resEntity = mono.block();
ResponseDTO myObj = resEntity.getBody();
MyObj ist also ein Objekt der ResponseDTO-Klasse.
Das Problem ist: Wenn ich die Konvertierung von 'response in ResponseDTO.java' in meiner Utility-Klasse durchführe, erhalte ich myObj = null. Wenn ich dies jedoch in meiner ServiceImpl.java mache (direkt nach dem Aufruf der Post-API), wird der richtige Text (ResponseDTO-Objekt) zurückgegeben. Das gleiche Problem tritt auch dann auf, wenn ich die Konvertierungs- und Nachaufrufoperation in zwei verschiedenen Methoden in der ServiceImpl.java ausführe. Muss ich hier etwas konfigurieren?
Antworten
Ich fand heraus, was das Problem war. Nach dem Aufruf von REST api wird der Body in der Antwort gelöscht, nachdem ich ihn zum ersten Mal aus der Antwort gelesen habe. Ich hatte eine Sysout-Anweisung in der Service-Implementierungsklasse, in der ich den Body-Inhalt gelesen habe.
Empfehlung: Lesen Sie den Body-Inhalt nur einmal und speichern Sie ihn in einer Variablen. Verwenden Sie es, wo immer es erforderlich ist.