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

Angular调用Spring Boot接口:POST成功但PATCH失败问题求助

问题排查与修复方案

核心问题点及修复步骤

1. Angular端:异步请求顺序错误,getLastBid无法获取正确ID

你的addBetOnTeam中,POST请求与后续PATCH请求并行执行,且getLastBid实现完全错误:

  • HTTP请求是异步操作,getLastBid中直接返回last.id时,请求还未完成,且last是Subscription对象而非请求结果,根本不存在id属性。
  • POST请求还未完成记录创建,就去获取"最后一条Bid",大概率拿到旧数据。

修复代码:

addBetOnTeam() {
  // 先执行POST,在回调中处理后续逻辑
  this.http.post(this.bidUrl, this.bidCreateForm.value).subscribe((createdBid: any) => {
    console.log('创建的Bid:', createdBid);
    // 直接使用POST返回的创建后Bid ID,无需额外请求
    const bidId = createdBid.id;
    const teamName = this.objectList[0].teams[0].name;
    const userEmail = this.getUser();
    const contestName = this.objectList[0].name;

    // 发送PATCH请求,必须subscribe才会触发
    this.http.patch(`/patch/${bidId}/${teamName}/${userEmail}/${contestName}`, null)
      .subscribe({
        next: () => console.log('PATCH更新成功'),
        error: (err) => console.error('PATCH失败:', err)
      });
  }, (err) => console.error('POST创建失败:', err));
}

同时删除getLastBid方法,直接复用POST请求返回的创建后对象ID(前提是Spring Boot的POST接口需返回创建后的BidPerContest对象)。

2. Angular端:PATCH请求未订阅,导致请求未发送

Angular的HttpClient方法返回Observable,只有调用subscribe()才会实际发送HTTP请求。原代码中的this.http.patch(...)未订阅,请求根本没发出去。

修复方式见上方代码,给PATCH请求添加subscribe并补充错误处理。

3. Spring Boot端:PATCH方法未持久化修改

patchBid方法中修改了BidPerContest对象的关联属性,但未调用保存方法同步到数据库,导致修改无效。

修复代码:

@PatchMapping("/patch/{id}/{teamN}/{userN}/{contestN}")
public void patchBid(@PathVariable(name = "contestN") String contestN,
                     @PathVariable(name = "id") long id,
                     @PathVariable(name = "teamN") String teamN,
                     @PathVariable(name = "userN") String userN) {

   BidPerContest bid = bidPerContestService.getBidPerContest(id);
   bid.setContest(contestService.getContestByName(contestN));
   bid.setTeam(teamService.getTeam(teamN));
   bid.setUser((User) userService.getUserByEmail(userN));
   // 新增:保存修改后的对象到数据库
   bidPerContestService.saveBidPerContest(bid);
}

确保bidPerContestService有对应的saveBidPerContest方法,内部调用JPA的save()完成持久化。

4. Spring Boot端:POST接口需返回创建后的对象

为让Angular直接拿到创建后的Bid ID,修改POST接口返回创建后的BidPerContest对象:

@PostMapping
public BidPerContest postBid(@RequestBody BidPerContest bid){
    return bidPerContestService.setBidPerContest(bid);
}

确保setBidPerContest方法内部调用JPA的save()并返回保存后的对象(包含自动生成的ID)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 04:16:23