为什么@RequestParam注释会绑定请求正文中的值?

时间:2018-05-16 09:31:22

标签: java spring spring-mvc

我有这个要求

@RequestMapping(value = "/test", method = RequestMethod.POST)
public void test(ModelMap modelMap, @RequestParam(value = "name") String name) {
    modelMap.put("result",name);
}

当我从Postman调用此请求并在请求正文和URL中传递Name参数时,结果如下:

The result is from body

但是如果我从请求体中删除参数,请求是这样的:

The result is from head

为什么@RequestParam注释首先绑定请求体的值?如果它不存在于正文中,它会绑定URL参数中的值

1 个答案:

答案 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;
    }
}