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规范)
- 先修改
CarRental-CRUD的服务层代码:
public Car addCar(Car car) { Car savedCar = carRepository.save(car); loggerService.writeLoggerMsg("CREATED CAR AND ADDED TO DB"); return savedCar; // 返回保存后的实体,会自动序列化为JSON }
- 修改
CarRental-CRUD的控制器层代码:
@PostMapping(path = "/addcar", consumes = "application/json") public Car addCar(@RequestBody Car car) { return adminCarService.addCar(car); }
- 再调整
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
相关产品推荐
相关产品推荐

