问题
在Spring MVC应用中,在controller层经常可以看见报这个错误“The request sent by the client was syntactically incorrect”,后台一般不会打印错误消息,而是直接返回给前端400错误。这是为什么呢?
分析
这大多是因为Spring控制层碰到了参数无法解析的错误,或者说请求数据与controller处理方法中的参数不匹配造成。例如,下面这个例子通过AJAX PUT一个json对象到后台,携带数据JSON.stringify(params)。
var jsondata = {
name: json,
age: 20
};
var param = jsondata;
后台处理如下:
@RequestMapping(method = RequestMethod.PUT, value="/{personName}/update")
public @ResponseBody ActionResponse<String>
update(HttpServletRequest req,
@PathVariable String department,
@PathVariable String personName,
@RequestBody Map<String, String> requestBodyParams){
String depolymentModel = requestBodyParams.get("personObject");
//...
}
这个时候就会报“The request sent by the client was syntactically incorrect”了,因为AJAX PUT的数据就是一个对象,没有键值对,在将RequestBody参数映射到Map型变量 requestBodyParams时,因为没有KEY,就报错了。
改正
有两种方法:
1、修改AJAX PUT数据类型,使用对象类型,形成KEY:VALUE结构,这样使用上面的后台就可以解析了。
var params = {
personObject: json
};
2、修改后台Controller的处理接收参数类型为String,直接接收RequestBody数据:
@RequestMapping(method = RequestMethod.PUT, value="/{personName}/update")
public @ResponseBody ActionResponse<String>
update(HttpServletRequest req,
@PathVariable String deparment,
@PathVariable String personName,
@RequestBody String requestBodyParams){
String personObject = requestBodyParams;
//...
return result;
}
后记
以后碰到这条错误信息时,首先应检查从客户端提交的数据是否与Controller 处理方法接收的参数类型一致,换句话说,POST的数据结构类型应和接收时进行类型匹配自动转换的数据类型要一致。