Return 使用 Spring WebClient 的完整响应
Return the complete response using Spring WebClient
我有以下代码
public ClientResponse doGet(HttpServletRequest request, URI uri) {
return webClient.get()
.uri(uri.toASCIIString())
.headers(headers -> headers.putAll(processRequest(request))
.exchange()
.block();
}
但是当我尝试通过 RestController return 这个 ClientResponse 时,
@GetMapping
@ResponseBody
public ClientResponse doGet(HttpServletRequest request) {
ClientResponse node = service.doGet(request);
return node;
}
我收到以下错误:
org.springframework.http.converter.HttpMessageNotWritableException: No
converter found for return value of type: class
org.springframework.web.reactive.function.client.DefaultClientResponse
基本上,我想要的最终目标是 return 将实际响应返回给调用者 - 包括 headers、body、cookies等
我正在考虑像下面这样使用 ResponseEntity。
public ResponseEntity<JsonNode> doGet2(HttpServletRequest request, URI uri) {
Mono<ClientResponse> clientResponse = webClient.get()
.uri(uri.toASCIIString())
.headers(headers -> headers.putAll(processRequest(request))
.exchange();
HttpHeaders headers = clientResponse.map(resp -> resp.headers().asHttpHeaders()).block();
JsonNode body = clientResponse.flatMap(resp -> resp.bodyToMono(JsonNode.class)).block();
ResponseEntity<JsonNode> jsonNode = ResponseEntity.ok().headers(headers).body(body);
return jsonNode;
}
但这又是一个大材小用。有没有办法直接使用 WebClient return 响应而不是重构响应?
通常,当您 return 将 pojo 作为 responseBody 时,spring 需要 class 为字段提供 getter。现在,由于您没有 return 拥有自己的 class,因此无法添加它们。
其他解决方案可以是向您的项目添加一个库,将 pojo 转换为 json。这个可以解决问题:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.0</version>
</dependency>
ClientResponse 的 toEntity
方法将其转换为 ResponseEntity 对象。
所以我想到了以下内容。
public ResponseEntity<String> doGet2(HttpServletRequest request, URI uri) {
ClientResponse clientResponse = webClient.get()
.uri(uri.toASCIIString())
.headers(headers -> headers.putAll(processRequest(request)))
.exchange()
.block();
return clientResponse.toEntity(String.class).block();
}
我有以下代码
public ClientResponse doGet(HttpServletRequest request, URI uri) {
return webClient.get()
.uri(uri.toASCIIString())
.headers(headers -> headers.putAll(processRequest(request))
.exchange()
.block();
}
但是当我尝试通过 RestController return 这个 ClientResponse 时,
@GetMapping
@ResponseBody
public ClientResponse doGet(HttpServletRequest request) {
ClientResponse node = service.doGet(request);
return node;
}
我收到以下错误:
org.springframework.http.converter.HttpMessageNotWritableException: No converter found for return value of type: class org.springframework.web.reactive.function.client.DefaultClientResponse
基本上,我想要的最终目标是 return 将实际响应返回给调用者 - 包括 headers、body、cookies等
我正在考虑像下面这样使用 ResponseEntity。
public ResponseEntity<JsonNode> doGet2(HttpServletRequest request, URI uri) {
Mono<ClientResponse> clientResponse = webClient.get()
.uri(uri.toASCIIString())
.headers(headers -> headers.putAll(processRequest(request))
.exchange();
HttpHeaders headers = clientResponse.map(resp -> resp.headers().asHttpHeaders()).block();
JsonNode body = clientResponse.flatMap(resp -> resp.bodyToMono(JsonNode.class)).block();
ResponseEntity<JsonNode> jsonNode = ResponseEntity.ok().headers(headers).body(body);
return jsonNode;
}
但这又是一个大材小用。有没有办法直接使用 WebClient return 响应而不是重构响应?
通常,当您 return 将 pojo 作为 responseBody 时,spring 需要 class 为字段提供 getter。现在,由于您没有 return 拥有自己的 class,因此无法添加它们。
其他解决方案可以是向您的项目添加一个库,将 pojo 转换为 json。这个可以解决问题:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.5.0</version>
</dependency>
ClientResponse 的 toEntity
方法将其转换为 ResponseEntity
public ResponseEntity<String> doGet2(HttpServletRequest request, URI uri) {
ClientResponse clientResponse = webClient.get()
.uri(uri.toASCIIString())
.headers(headers -> headers.putAll(processRequest(request)))
.exchange()
.block();
return clientResponse.toEntity(String.class).block();
}