通过AJAX以JSON格式传递日期至Web服务时出现400状态码错误
解决Spring Boot接收前端AJAX日期参数返回400错误的问题
看起来你遇到的400 Bad Request错误,核心原因是前端传递的日期格式(DD-MM-YYYY)和Spring Boot默认的日期解析格式不匹配,另外你的AJAX代码还有一个小变量错误,我一步步帮你解决:
一、先修复前端AJAX的变量名错误
你的JS代码里定义了var project=$("#project_name").val();,但在JSON.stringify里写的是projectName:project_name——这里project_name是未定义的变量,应该改成projectName: project,否则后端会收到projectName为null的参数,这也可能引发参数校验错误:
var start_date=$("#start").val(); var end_date=$("#end").val(); var project=$("#project_name").val(); $.ajax({ url: url, type: 'POST', contentType:'application/json', // 修复变量名错误 data: JSON.stringify({ projectName: project, startDate: start_date, endDate: end_date }), success: function (rtndata) { } });
二、核心问题:日期格式不匹配导致解析失败
Spring Boot默认使用Jackson来解析JSON日期,它的默认日期格式是yyyy-MM-dd,但你前端传递的是DD-MM-YYYY,所以Jackson无法解析这个格式,直接返回400错误。下面是三种可行的解决方案:
方案1:在后端实体类的日期字段上添加注解
如果你的后端是用@RequestBody接收一个实体类,直接在日期字段上添加@JsonFormat注解,指定解析格式:
import com.fasterxml.jackson.annotation.JsonFormat; import java.time.LocalDate; public class ProjectDTO { private String projectName; // 指定日期格式和时区(根据你的业务调整时区) @JsonFormat(pattern = "dd-MM-yyyy", timezone = "GMT+8") private LocalDate startDate; @JsonFormat(pattern = "dd-MM-yyyy", timezone = "GMT+8") private LocalDate endDate; // 别忘了添加getter和setter方法 }
如果你的后端用的是java.util.Date类型,同样适用这个注解,只需要把字段类型换成Date即可。
方案2:全局配置Jackson的日期解析格式
如果你不想每个实体类都加注解,可以在Spring Boot的配置文件里全局设置日期格式:
application.properties配置:
# 全局设置JSON日期解析格式 spring.jackson.date-format=dd-MM-yyyy # 设置时区,根据你的业务场景调整 spring.jackson.time-zone=GMT+8
application.yml配置:
spring: jackson: date-format: dd-MM-yyyy time-zone: GMT+8
方案3:前端转换日期格式为后端默认的yyyy-MM-dd
如果你不想修改后端配置,可以在前端把DD-MM-YYYY格式的日期转换成yyyy-MM-dd再传递。比如用原生JS处理:
// 转换日期格式:DD-MM-YYYY -> YYYY-MM-DD function formatDateForBackend(dateStr) { const parts = dateStr.split('-'); return `${parts[2]}-${parts[1]}-${parts[0]}`; } var start_date = formatDateForBackend($("#start").val()); var end_date = formatDateForBackend($("#end").val()); var project = $("#project_name").val(); $.ajax({ url: url, type: 'POST', contentType:'application/json', data: JSON.stringify({ projectName: project, startDate: start_date, endDate: end_date }), success: function (rtndata) { } });
如果你的项目里用了Moment.js,处理会更简单:
var start_date = moment($("#start").val(), 'DD-MM-YYYY').format('YYYY-MM-DD'); var end_date = moment($("#end").val(), 'DD-MM-YYYY').format('YYYY-MM-DD');
三、额外检查点
- 确保后端控制器的方法是用
@RequestBody接收JSON参数,比如:
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController public class ProjectController { @PostMapping("/your-url") public String saveProject(@RequestBody ProjectDTO projectDTO) { // 处理插入数据库逻辑 return "success"; } }
- 检查后端实体类的字段名和前端JSON的键完全匹配(比如前端是
startDate,后端字段也要是startDate,或者用@JsonProperty("startDate")指定映射关系)。
内容的提问来源于stack exchange,提问作者Tamil
相关产品推荐
相关产品推荐

