问题描述
我已经开始使用WebClient(org.springframework.web.reactive.function.client.WebClient)调用其余服务。我有2个类,分别是Utility.java和ServiceImpl.java。 我使用WebClient的地方是ServiceImpl.java。我正在拨打的帖子看起来像-
ClientResponse response = webClient.post()
.uri(path)
.body(Mono.just(inputDTO),InputDTO.class)
.exchange()
.block();
(上面的ClientResponse是org.springframework.web.reactive.function.client.ClientResponse) (我正在使用检索的即时交换,因为我想要标题以及状态码)
现在尝试将此响应转换为某些DTO-ResponseDTO。
Mono<ResponseEntity<ResponseDTO>> mono = response.toEntity(ResponseDTO.class);
ResponseEntity<ResponseDTO> resEntity = mono.block();
ResponseDTO myObj = resEntity.getBody();
所以myObj是ResponseDTO类的对象。
问题是-当我在实用程序类中执行“将响应转换为ResponseDTO.java”时,我得到myObj = null。但是,如果我在ServiceImpl.java中执行此操作(在调用post API之后),它将返回正确的主体(ResponseDTO对象)。 即使我以ServiceImpl.java中的两种不同方法执行转换和调用后操作,也会发生相同的问题。 我需要在这里配置一些东西吗?
解决方法
我发现了问题所在。 调用REST API之后,如果是第一次从响应中读取响应后,响应中的主体就会被清空。我正在读取主体内容的服务实现类中有一条Sysout语句。
建议:仅读取一次正文内容并将其存储在变量中。在任何需要的地方使用它。