POST传日期列表触发HttpMessageNotReadableException问题排查
解决Spring Controller接收AngularJS POST请求时的HttpMessageNotReadableException异常
你遇到的这个HttpMessageNotReadableException: Required request body is missing异常,核心问题是前端传参方式和后端接收方式不匹配,我帮你拆解下问题并给出修复方案:
问题根源
- 你在前端把序列化后的列表拼在了URL路径里(
"PlanAuditController/saveUpdateAnualAudit/"+$scope.auditCycleLst),这是GET请求传参的思路,但你用的是POST请求,POST请求的业务数据应该放在**请求体(Request Body)**里,而不是URL路径中。 - 后端Controller用了
@RequestBody注解,这个注解的作用是从请求体中解析JSON数据并转换成Java对象,但你的请求体是空的,所以Spring会抛出“请求体缺失”的异常。 - 后端
@RequestMapping里的/{auditCycleLst}路径变量完全多余,因为你根本不是通过路径传递这个列表参数。
修复后的代码
前端AngularJS代码
去掉手动JSON序列化($http会自动处理),把列表数据放在data属性中,这才是POST请求传体数据的正确方式:
$scope.saveUpdateAnualAudit=function(auditPlanLst) { $http({ method: 'POST', url: "PlanAuditController/saveUpdateAnualAudit", data: auditPlanLst // 直接传入原始列表对象,无需手动序列化 }).success(function(data, status) { // 这里可以添加请求成功后的逻辑,比如提示保存成功 }) .error(function(data, status) { $scope.errorMsg= "<strong>Error!</strong> Failed to retrieve AuditPlan."; $scope.showErrorAlert = true; $scope.showSuccessAlert = false; }); }
后端Spring Controller代码
移除路径变量,只保留@RequestBody来接收请求体中的JSON列表:
@RequestMapping(value = "/saveUpdateAnualAudit", method = RequestMethod.POST) public String saveUpdateAnualAudit(@RequestBody List<AuditCycleJsonVo> auditCycleLst) { try { // 可以先打印接收到的数据,验证是否正确 System.out.println("Received audit cycle list size: " + auditCycleLst.size()); for(AuditCycleJsonVo cycle : auditCycleLst) { System.out.println("Start Date: " + cycle.getStartDate() + ", End Date: " + cycle.getEndDate()); } System.out.println("Saved to db"); }catch(Exception e){ e.printStackTrace(); } return "planAudits"; }
额外注意事项
- 确保你的
AuditCycleJsonVo类的属性名和前端传入的JSON对象的键完全一致(比如前端每个对象的startDate对应后端的startDate属性),Spring的Jackson转换器才能正确映射数据。如果键名不一致,可以用@JsonProperty注解指定映射关系,比如:@JsonProperty("start_date") private String startDate; - 检查项目依赖:如果是Spring Boot项目,默认已经包含Jackson依赖;如果是传统Spring项目,需要确保引入了
jackson-databind相关依赖,否则Spring无法解析JSON请求体。 - 调试时可以用浏览器开发者工具的Network面板,查看请求的Request Body是否包含正确的JSON数据,以及请求头的
Content-Type是否为application/json(AngularJS的$http会自动设置)。
内容的提问来源于stack exchange,提问作者user1662039
相关产品推荐
相关产品推荐

