SpringMVC 接收包含 Date 字段的 JSON 請求,嘗試 Converter、@InitBinder、@DateTimeFormat 等多種方案均報 400 Bad Request。
實體類中 Date 字段的 Getter 方法上有序列化註解(如 @JsonFormat),但 Setter 方法上缺少反序列化註解,導致 Jackson 反序列化失敗,請求甚至未進入 Controller,
@InitBinder自然不生效。
public class MyEntity {
private Date createTime;
// ❌ 只有 Getter 有註解,Setter 沒有
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
}
public class MyEntity {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
public Date getCreateTime() { return createTime; }
public void setCreateTime(Date createTime) { this.createTime = createTime; }
}
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
public Date getCreateTime() { return createTime; }
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
public void setCreateTime(Date createTime) { this.createTime = createTime; }
@Configuration
public class JacksonConfig {
@Bean
public ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
mapper.setTimeZone(TimeZone.getTimeZone("GMT+8"));
// 禁用將日期序列化為 timestamp
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
return mapper;
}
}
@InitBinder 是 WebDataBinder 階段處理表單數據/路徑變量,不處理 JSON Body 反序列化// 開啟 Jackson 詳細錯誤日誌
logging.level.com.fasterxml.jackson.databind=DEBUG
// 或捕獲 HttpMessageNotReadableException 全局異常處理
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(HttpMessageNotReadableException.class)
@ResponseBody
public Result handleJsonParseError(HttpMessageNotReadableException e) {
log.error("JSON 解析失敗", e);
return Result.error("JSON 格式錯誤: " + e.getMostSpecificCause().getMessage());
}
}