Spring Boot中Ajax POST日期字符串转yyyy-mm-dd HH:mm:ss格式报错处理
解决Spring Boot中日期字符串转yyyy-MM-dd HH:mm:ss格式的400错误
这个问题我碰到过好几次,本质是Spring MVC无法正确将前端传来的日期字符串反序列化成后端的Date类型,触发了HttpMessageNotReadableException,导致400 Bad Request错误。给你几个靠谱的解决方案:
方案1:在实体类字段上添加注解(局部配置)
直接在InvoiceForm的dueDate字段上标注日期格式化注解,指定预期的格式和时区:
import com.fasterxml.jackson.annotation.JsonFormat; import org.springframework.format.annotation.DateTimeFormat; import java.util.Date; public class InvoiceForm { // 其他字段... // 反序列化时匹配yyyy-MM-dd HH:mm:ss格式,时区根据你的业务调整(比如GMT+8是中国时区) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") // 处理表单参数提交场景的格式化(Ajax传JSON时主要靠@JsonFormat,但加上更全面) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date dueDate; // getter和setter方法 }
说明:
@JsonFormat是给Jackson框架用的,负责处理JSON请求体的反序列化;@DateTimeFormat用于处理传统表单提交的参数(比如application/x-www-form-urlencoded格式);- 时区一定要和前端保持一致,避免出现日期偏移的问题。
方案2:全局配置日期格式化(推荐)
如果你的项目中有很多日期字段需要统一格式,没必要每个字段都加注解,直接全局配置Jackson的规则:
创建一个Spring配置类:
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; import java.text.SimpleDateFormat; @Configuration public class JacksonDateConfig { @Bean public ObjectMapper objectMapper(Jackson2ObjectMapperBuilder builder) { ObjectMapper objectMapper = builder.createXmlMapper(false).build(); // 设置全局Date类型的序列化/反序列化格式 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); objectMapper.setDateFormat(dateFormat); // 如果使用Java 8的LocalDateTime/LocalDate等时间API,需要注册对应模块 objectMapper.registerModule(new JavaTimeModule()); // 关闭将日期序列化为时间戳的默认行为 objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); return objectMapper; } }
说明:
- 这个配置会对所有Date/Java 8时间类型的字段生效;
- 如果你用的是Java 8的时间API(比如
LocalDateTime),记得引入jackson-datatype-jsr310依赖(Spring Boot starter-web默认已经包含)。
方案3:前端确保传递的日期字符串格式完全匹配
有时候问题出在前端传递的日期格式和后端预期不一致,比如前端传的是yyyy-MM-dd,而后端要的是yyyy-MM-dd HH:mm:ss,这时候可以在前端先把日期转成正确格式再发送请求。比如用moment.js处理:
// 假设你用jQuery和moment.js const dueDateInput = $('#dueDate').val(); // 将输入的日期转为yyyy-MM-dd HH:mm:ss格式 const formattedDueDate = moment(dueDateInput).format('YYYY-MM-DD HH:mm:ss'); // 构造请求体 const invoiceForm = { // 其他字段... dueDate: formattedDueDate }; // 发送Ajax请求 $.ajax({ url: '/your-invoice-api-url', type: 'POST', contentType: 'application/json', // 一定要指定Content-Type为JSON data: JSON.stringify(invoiceForm), success: function(res) { // 处理成功逻辑 }, error: function(err) { // 处理错误 } });
注意:
- 前端传递的字符串格式必须和后端配置的完全一致,包括大小写(比如
YYYY对应四位年份,yyyy也可以,但要统一)、分隔符(-和:不要写错); - 发送Ajax时要设置
contentType: 'application/json',确保后端按JSON格式解析请求体。
内容的提问来源于stack exchange,提问作者Emmerson Deneir
相关产品推荐
相关产品推荐

