错误描述:
HTTP Status 400 – Bad Request
Type Status Report
Description The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing).
译:由于被认为是客户端错误(例如,格式错误的请求语法、无效的请求消息帧或欺骗性的请求路由),服务器无法或将不会处理请求。
引起的主要原因:
1、页面请求参数类型与后端不匹配
2、无效的请求方法:服务器不支持前端发送的请求方法(如GET、POST、PUT、DELETE等)
3、服务器端校验失败:服务器端对请求进行了校验,发现请求不符合要求,因此返回400错误。
解决方式:
首先针对本人遇到的问题。由于前端传入了一个时间参数 1986-05-04,导致在前端就直接报400,也没有进入到后端接口中。奇葩的是,换个时间就丝毫不受影响。一切正常。
分析下原因:
极大可能是因为夏令时引起的。当时间为1940-06-03、1941-03-16、1986-05-04、1987-04-12、1988-04-10、1989-04-16、1990-04-15、1991-04-14这些就可能有问题。原来的方式是加的 @DateTimeFormat注解,特殊日期就会报400。
@DateTimeFormat只能处理后端到前端阶段(出参),而我们前端到后端的阶段并没有进行处理。所以我们需要加上入参(前端到后端的处理过程)前端到后端的部分则可以用@JsonFormat注解。
@DateTimeFormat(pattern="yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date birthday;
正常情况下,就已经搞定了。
但是,我的就还有问题。就是头铁。
我就在Controller层里写了个方法将Date类型参数进行转换。并将实体中的@DateTimeFormat、@JsonFormat注释
/*通过@InitBinder注解的initBinder方法注册了一个自定义的PropertyEditor,用于将字符串转换为*Date对象
*PropertyEditorSupport它提供了PropertyEditor接口的实现,用于处理属性的编辑和转换
*/
@InitBinder
public void initBinder(WebDataBinder binder) {
//Date 类型转换
binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
@Override
public void setAsText(String text) {
if (StringUtils.isEmpty(text)) {
return;
}
setValue(DateUtils.parse(text, Arrays.asList(PARSE_PATTERNS)));
}
});
}
public final static String[] PARSE_PATTERNS = {
"yyyy-MM-dd HH:mm:ss.SSS", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM-dd", "yyyy-MM",
"yyyy/MM/dd HH:mm:ss.SSS", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM/dd", "yyyy/MM",
"yyyy.MM.dd HH:mm:ss.SSS", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM.dd", "yyyy.MM",
"yyyyMMddHHmmssSSS", "yyyyMMddHHmmss", "yyyyMMddHHmm", "yyyyMMdd", "yyyyMM"
};
再次测试就ok了。
具体情况还需具体分析。此篇文章仅供参考。如有问题可私信或评论区指正。