2

我有以下代码

public ClientResponse doGet(HttpServletRequest request, URI uri) {
    return webClient.get()
            .uri(uri.toASCIIString())
            .headers(headers -> headers.putAll(processRequest(request))
            .exchange()
            .block();
}

但是当我尝试通过 RestController 返回这个 ClientResponse 时,如下所示,

@GetMapping
@ResponseBody
public ClientResponse doGet(HttpServletRequest request) {
    ClientResponse node = service.doGet(request);
    return node;
}

我收到以下错误:

org.springframework.http.converter.HttpMessageNotWritableException:没有找到类型的返回值的转换器:类 org.springframework.web.reactive.function.client.DefaultClientResponse

基本上,我想要的最终目标是将实际响应返回给调用者——包括标题、正文、cookie等。

我正在考虑使用 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 返回响应而不是重组响应?

4

2 回答 2

4

ClientResponse 的toEntity方法将其转换为 ResponseEntity<Mono> 对象。所以我想出了以下内容。

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();
}
于 2020-09-25T14:05:27.640 回答
1

通常,当您将 pojo 作为 responseBody 返回时,spring 要求该类具有字段的 getter。现在,由于您没有返回您拥有的课程,因此您无法添加它们。
其他解决方案可以是向您的项目添加一个库,将 pojo 转换为 json。这个可以解决问题:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.5.0</version>
</dependency>
于 2020-09-25T10:07:11.723 回答