Почему аннотация @RequestParam связывает значение из тела запроса? - PullRequest
0 голосов
/ 16 мая 2018

У меня есть этот запрос

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

Когда я вызываю этот запрос от Почтальона и передаю параметр Name в теле запроса и в URL-адресе, результат выглядит следующим образом:

The result is from body

Но если я удалю параметр из тела запроса, запрос будет выглядеть так:

The result is from head

Почему аннотация @RequestParam сначала связывает значение из тела запроса? и если он не существует в теле, он связывает значение из параметров URL

1 Ответ

0 голосов
/ 16 мая 2018

Потому что так работает ServletRequest .За сценой @RequestParam использует ServletRequest # getParameter .Если вы посмотрите на документацию по Java, в нем будет четко указано, что используются параметры запроса или данные публикации формы.

Для сервлетов HTTP параметры содержатся в строке запроса или данных опубликованной формы.

Если в запросе и результатах данных есть несколько значений для одного и того же ключа, то он возвращает первое значение в массиве, возвращаемое getParameterValues ​​.

Кроме тоговы используете multipart/form-data тип содержимого, поэтому пружина обрабатывает его с помощью 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...