Потому что так работает 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;
}
}