java – 为什么@RequestParam注释绑定请求体的值?

我有这个要求

@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参数中的值

最佳答案
因为这是ServletRequest的工作方式.在场景后面@RequestParam使用ServletRequest#getParameter.如果你看一下java doc,它会清楚地说明使用了查询参数或表单发布数据.

For HTTP servlets, parameters are contained in the query string or posted form data.

如果查询和发布数据中存在多个值,例如相同的键,则返回getParameterValues返回的数组中的第一个值.

此外,您正在使用multipart / form-data内容类型,因此Spring使用DefaultMultipartHttpServletRequest处理它,其中首先返回在body中找到的参数:

@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;
    }
}

转载注明原文:java – 为什么@RequestParam注释绑定请求体的值? - 代码日志