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

使用WebClient发送POST请求无法将数据插入数据库问题求助

核心原因

1. 客户端侧冷流未触发执行

WebClient返回的Mono/Flux属于冷发布者,只有被订阅时才会真正执行请求逻辑。你当前的sendSms方法仅返回了Mono实例,如果上层调用方没有对这个返回值做订阅(比如调用subscribe()、block(),或者把它纳入Spring响应式流水线返回给前端/上游),整个POST请求从始至终都不会被发送,自然不会有数据写入数据库。

2. 服务端侧异步逻辑未等待完成

如果你的SmsSendService.sendSms是响应式方法(返回Mono/Flux类型),控制器中直接调用方法但没有订阅/拼接响应流水线,会出现控制器直接返回响应,而数据库写入的异步逻辑还未执行就被销毁的问题,最终导致数据没有落库。

排查方案

  • 先在客户端sendSms的return语句前加日志,同时在服务端sendSms控制器入口加请求日志,确认POST请求是否真的到达了服务端
  • 如果请求未到达服务端:检查上层调用sendSms方法的代码,是否对返回的Mono做了订阅
  • 如果请求已到达服务端但request参数为空:检查WebClient POST请求是否正确设置了Content-Type: application/json头,服务端是否能正常解析JSON格式的请求体
  • 如果请求参数正常:检查SmsSendService.sendSms的返回值类型,确认是否是响应式类型,同时在该方法的数据库操作逻辑前后加日志,确认写入逻辑是否被执行

解决方法

客户端侧修正

根据调用场景选择对应处理方式:

  1. 非响应式环境调用:可以临时调用block()同步等待请求完成,注意不要在响应式流水线内使用block()
// 调用示例
sendSms(request).block();
  1. 响应式环境调用:将返回的Mono拼接进现有响应式流水线,由框架自动订阅
// 响应式控制器调用示例
@PostMapping("/client-send")
public Mono<BulkSmsRequestResource> clientSend(@RequestBody BulkSmsRequestResource request) {
    return sendSms(request); // 直接返回Mono,Spring会自动订阅执行
}

如果是请求头缺失的问题,在WebClient构造POST请求时补充内容类型声明:

Mono<BulkSmsRequestResource> bulkSmsRequestResourceMono = webClientBuilder.build()
        .post()
        .uri(url1)
        .contentType(MediaType.APPLICATION_JSON) // 补充JSON内容类型声明
        .body(Mono.just(request), BulkSmsRequestResource.class)
        .retrieve()
        .bodyToMono(BulkSmsRequestResource.class);

服务端侧修正

如果SmsSendService.sendSms是响应式方法,修改控制器逻辑,等待写入操作完成后再返回响应:

@PostMapping("/send")
public Mono<ResponseEntity<? extends ResponseResource>> sendSms(@RequestBody BulkSmsRequestResource request) {
    if (request == null) {
        return Mono.just(new ResponseEntity<>(new ErrorResponseResource("Transaction failed successfully!", 400), HttpStatus.BAD_REQUEST));
    }
    // 拼接响应式流水线,等待写入完成后再返回成功响应
    return this.smsSendService.sendSms(request)
            .then(Mono.just(new ResponseEntity<>(new SuccessResponseResource("Transaction done successfully", 200), HttpStatus.OK)));
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 17:48:02