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

通过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');

三、额外检查点

  1. 确保后端控制器的方法是用@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";
    }
}
  1. 检查后端实体类的字段名和前端JSON的键完全匹配(比如前端是startDate,后端字段也要是startDate,或者用@JsonProperty("startDate")指定映射关系)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:25:23