我有这个要求
@RequestMapping(value = "/test", method = RequestMethod.POST)
public void test(ModelMap modelMap, @RequestParam(value = "name") String name) {
modelMap.put("result",name);
}
当我从Postman调用此请求并在请求正文和URL中传递Name
参数时,结果如下:
但是如果我从请求体中删除参数,请求是这样的:
为什么@RequestParam
注释首先绑定请求体的值?如果它不存在于正文中,它会绑定URL参数中的值
答案 0 :(得分:2)
因为这是ServletRequest的工作方式。场景背后@RequestParam正在使用ServletRequest#getParameter。如果你看一下java doc,它会清楚地说明使用查询参数或表单发布数据。
对于HTTP servlet,参数包含在查询字符串或发布的表单数据中。
如果查询和发布数据中存在多个相同键的值,则返回getParameterValues返回的数组中的第一个值。
此外,您正在使用multipart/form-data
内容类型,因此Spring会使用DefaultMultipartHttpServletRequest
来处理它,其中首先返回在主体中找到的参数:
@Override
public String[] getParameterValues(String name) {
String[] parameterValues = super.getParameterValues(name);
String[] mpValues = getMultipartParameters().get(name);
if (mpValues == null) {
return parameterValues;
}
if (parameterValues == null || getQueryString() == null) {
return mpValues;
}
else {
String[] result = new String[mpValues.length + parameterValues.length];
System.arraycopy(mpValues, 0, result, 0, mpValues.length);
System.arraycopy(parameterValues, 0, result, mpValues.length, parameterValues.length);
return result;
}
}