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
相关产品推荐
相关产品推荐

