背景:本地jetty启动应用,测试一个页面接口时候报错:
在chrome浏览器中的network里查看response信息如下:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
<title>Error 400 Bad Request</title>
</head>
<body><h2>HTTP ERROR 400</h2>
<p>Problem accessing /xxx/xxxx/xxxxxx. Reason:
<pre> Bad Request</pre></p><hr /><i><small>Powered by Jetty://</small></i><br/>
<br/> 。。。。。。。
解决方案:一开始看到http 400 Problem accessing /xxx/xxxx ,还以为是客户端无法访问后台指定路径的后台接口,原谅我懵逼了一波,错以为是404了,,,,
这里记录一下400错误码的场景:
在ajax请求后台数据时有时会报 HTTP 400 错误 - 请求无效 (Bad request);出现这个请求无效报错说明请求没有进入到后台服务里(注意:并不是找不到指定路径的接口,找到了,但由于某种原因无法正常调通这个接口):
原因:1)前端提交数据的字段名称或者是字段类型和后台的实体类不一致,导致无法封装;
2)前端提交的到后台的数据应该是json字符串类型,而前端没有将对象转化为字符串类型;
这里,我遇到的场景是对应第一点,前端传递一个日期格式的数据到后台,但是前端空值的时候是字符串类型的,而我后台接口上写的实体类的字段的类型是java.util.Date ,前后端的数据的字段类型不匹配,导致无法封装,从而前端页面无法调通后台接口,报http 400 bad request;
那么,解决前端传递时间类型的数据到后台的冲突问题,有2中方法:
第一:把后台的字段的类型从java.util.Date更改成java.lang.String类型
第二:在后台的Date类型的字段上加上注解--- @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss"),自动把前端的String类型转化为后台Date类型来封装
(org.springframework.format.annotation.DateTimeFormat)
这里,由于其他地方的逻辑代码已经封装好了,所以使用第二种方法,直接加上注解@DateTimeFormat