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

Spring Boot WebClient调用跨端口REST API返回text/plain类型不匹配问题求助

问题根因

  • 你的CarRental-CRUD的/addcar接口返回值为String类型,Spring MVC默认会将字符串响应的Content-Type设为text/plain;charset=UTF-8,而非JSON格式
  • CarRental-API中调用WebClient时,指定了响应体转换为Car类,text/plain类型无法反序列化为实体类,因此抛出类型不支持异常
  • 额外问题:你当前的WebClient请求未设置请求体,也未加http://前缀,且响应式调用没有触发订阅,实际请求不会被发送

解决方案

方案一:保留CRUD接口原有返回逻辑,调整WebClient代码

修改CarRental-API的服务层代码如下:

public String addCar(Car car) {
    // 发送请求并接收字符串响应
    String crudResponse = webClientBuilder
            .build()
            .post()
            .uri("http://localhost:8081/crud/v1/addcar") // 补全http前缀
            .bodyValue(car) // 传入要提交的Car请求体
            .retrieve()
            .bodyToMono(String.class) // 适配响应的String类型
            .block(); // 阻塞等待响应,响应式项目可替换为订阅逻辑
    return loggerService.writeLoggerMsg("ADDED CAR TO DB");
}

方案二:调整CRUD接口返回保存后的Car对象(更符合REST规范)

  1. 先修改CarRental-CRUD的服务层代码:
public Car addCar(Car car) {
    Car savedCar = carRepository.save(car);
    loggerService.writeLoggerMsg("CREATED CAR AND ADDED TO DB");
    return savedCar; // 返回保存后的实体,会自动序列化为JSON
}
  1. 修改CarRental-CRUD的控制器层代码:
@PostMapping(path = "/addcar", consumes = "application/json")
public Car addCar(@RequestBody Car car) {
    return adminCarService.addCar(car);
}
  1. 再调整CarRental-API的WebClient代码,适配响应的Car类型:
public String addCar(Car car) {
    Car savedCar = webClientBuilder
            .build()
            .post()
            .uri("http://localhost:8081/crud/v1/addcar")
            .bodyValue(car)
            .retrieve()
            .bodyToMono(Car.class)
            .block();
    return loggerService.writeLoggerMsg("ADDED CAR TO DB, ID: " + savedCar.getCarId());
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 12:06:04