问题描述
2020-02-13 19:32:04.322 WARN 109508 --- [p-nio-80-exec-4] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported]
自定义返回JSON:
前端代码
$.ajax({
url:"khRyPfGsController.do?saveRows",
type:"post",
data:JSON.stringify(result),
dataType:"json",
success:function(data){
tip(data.msg);
if(data.success){
reloadTable();
}
}
})
后端代码
@RequestMapping(params = "saveRows")
@ResponseBody
public AjaxJson saveRows(@RequestBody List<Map<String, Object>> list) {
//省略
}
问题分析
如果Content-Type设置为“application/x-www-form-urlencoded;charset=UTF-8”
无论是POST请求还是GET请求都是可以通过@RequestParam成功获取参数
但是如果前端POST请求中的body是Json对象的话,会报错误
[Content type 'application/json' not supported]
反之:
[Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported]
请求中传JSON时设置的Content-Type 如果是application/json或者text/json时,JAVA中request.getParameter("")怎么也接收不到数据。这是因为,Tomcat的HttpServletRequest类的实现类为org.apache.catalina.connector.Request(实际上是org.apache.coyote.Request)。
当前端请求的Content-Type是Json时,可以用@RequestBody这个注解来解决。
@RequestParam 底层是通过request.getParameter方式获得参数的,换句话说,@RequestParam 和request.getParameter是同一回事。因为使用request.getParameter()方式获取参数,可以处理get 方式中queryString的值,也可以处理post方式中 body data的值。所以,@RequestParam可以处理get 方式中queryString的值,也可以处理post方式中 body data的值。
@RequestParam用来处理Content-Type: 为 application/x-www-form-urlencoded编码的内容,提交方式GET、POST。
@RequestBody接受的是一个json对象的字符串,而不是Json对象,在请求时往往都是Json对象,用JSON.stringify(data)的方式就能将对象变成json字符串。
解决方案
JS代码加上contentType:"application/json"即可
$.ajax({
url:"khRyPfGsController.do?saveRows",
type:"post",
data:JSON.stringify(result),
contentType:"application/json",
dataType:"json",
success:function(data){
tip(data.msg);
if(data.success){
reloadTable();
}
}
})