Angular Post请求体被Spring API接收时为null的问题排查
问题原因及解决方案
你的问题出在Angular的HttpClient.post调用方式错误,导致请求体没有正确发送到Spring后端。
错误点分析
- post方法参数顺序错误:
HttpClient.post的第二个参数是请求体数据,第三个参数才是包含headers、params等的配置对象。你当前把请求体写成{params: data, headers: headers},这会让Angular把这个对象作为请求体发送,而非你定义的data对象,Spring自然无法解析到正确参数。 - 多余的HttpParams操作:你创建
params并将data转成字符串作为请求参数,但Spring接口用@RequestBody接收请求体而非URL参数,这部分代码完全无效。
修正后的Angular服务代码
import { Injectable } from '@angular/core'; import {HttpClient} from "@angular/common/http"; @Injectable({ providedIn: 'root' }) export class TftCalculatorService { apiUrl = 'http://localhost:8080' constructor(private http: HttpClient) { } calculateChanceOfHitting(){ const data = { "name":"Mordekaiser", "targetCount":3, "currentUnits":0, "sameUnitOnOtherBoards":0, "currentLevel":8, "currentGold": 130, "prismaticTicket": false }; // 正确的post调用:第二个参数是请求体data,第三个是配置对象(可选) return this.http.post<any>(`${this.apiUrl}/calculateChanceOfHitting`, data); } }
额外说明
- Angular的
HttpClient默认会把JavaScript对象序列化为JSON,并且自动设置Content-Type: application/json,所以手动设置headers的代码可以省略。 - 确认Spring端
CalculatorParams实体类的字段名称和JSON键完全匹配(大小写一致),比如prismaticTicket对应Java类的isPrismaticTicket()方法,Jackson序列化默认兼容这种命名,但字段名不匹配会导致解析失败。
内容的提问来源于stack exchange,提问作者alexander acevedo
相关产品推荐
相关产品推荐

