You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot WebFlux中WebTestClient如何将响应转换为ResponseEntity

问题根因

你之前的写法存在两个核心问题:

  1. 控制器返回的Mono<ResponseEntity<Data>>是Spring WebFlux的内部响应封装对象,网络传输时只会输出状态码、响应头、响应体三个部分,并不会把整个ResponseEntity对象序列化后传给客户端。因此你直接调用expectBody(ResponseEntity.class)尝试把响应体反序列化为ResponseEntity对象必然报错,因为响应体本身就是你的业务实体Data的JSON结构,和ResponseEntity的类结构完全不匹配。
  2. 请求头名称拼写错误:标准的内容协商请求头是Accept而非Accepts,拼写错误可能导致服务端返回非预期的内容类型。

正确实现

WebTestClient 本身已经提供了直接获取完整ResponseEntity的能力,不需要手动反序列化,有两种写法可选:

写法1:使用内置toEntity方法(最简便)

import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.test.web.reactive.server.WebTestClient;

@Autowired
private WebTestClient webTestClient;

public ResponseEntity<Data> get() {
    return webTestClient.get()
            .uri(uriBuilder -> uriBuilder
                    .path(VISUALIZATION_URL)
                    .build())
            .accept(MediaType.APPLICATION_JSON)
            .exchange()
            .expectBody(Data.class) // 指定响应体对应的业务实体类型
            .toEntity() // 直接封装为包含全量响应元数据的ResponseEntity对象
            .block(); // 同步等待异步结果返回
}

写法2:手动从EntityExchangeResult拼装

如果你需要对中间结果做更多自定义处理,可以从返回结果中手动拼装ResponseEntity:

import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.test.web.reactive.server.EntityExchangeResult;
import org.springframework.test.web.reactive.server.WebTestClient;

@Autowired
private WebTestClient webTestClient;

public ResponseEntity<Data> get() {
    EntityExchangeResult<Data> result = webTestClient.get()
            .uri(uriBuilder -> uriBuilder
                    .path(VISUALIZATION_URL)
                    .build())
            .accept(MediaType.APPLICATION_JSON)
            .exchange()
            .expectBody(Data.class)
            .returnResult();

    return ResponseEntity
            .status(result.getStatus())
            .headers(result.getResponseHeaders())
            .body(result.getResponseBody());
}

校验说明

拿到ResponseEntity<Data>之后,你可以直接在Cucumber校验步骤中读取:

  • 响应状态:responseEntity.getStatusCode()
  • 所有响应头:responseEntity.getHeaders(),包含缓存头、内容类型等所有元数据
  • 响应体内容:responseEntity.getBody(),已经自动反序列化为你的业务实体Data对象,不需要手动解析JSON

内容的提问来源于stack exchange,提问作者plzdontkillme

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 22:45:03