Вот фрагмент кода ServletServerHttpRequest
, который расширяет HttpInputMessage
.Я весьма уверен, что это реализация, которую вы используете в своем коде:
public InputStream getBody() throws IOException {
return this.servletRequest.getInputStream();
}
Другими словами, тело запроса предназначено для чтения в качестве входного потока объекта HttpServletRequest
.
Поток ввода запроса недопустим в нескольких ситуациях, но я не могу найти правильную документацию для него в данный момент.Например, если вы вызываете request.getParameter()
для запроса на публикацию, tomcat должен прочитать входной поток, чтобы интерпретировать параметры, поэтому после чтения входного потока он будет пустым, поскольку он уже достиг конца.
Возможно, вы вызываете getParameter
где-то в перехватчике или, возможно, в фильтре, определенном в web.xml.Другой вариант заключается в том, что Spring делает это для вас, например, если у вашего контроллера есть какой-то другой метод со сложными @RequestMapping
s (такими как чтение значений параметров или значений заголовков).
У меня есть два предложения дляyou:
Добавьте фильтр сервлетов (до того, как у Spring появится возможность действовать) и оберните запрос своей собственной оболочкой (просто добавьте HttpServletRequestWrapper ).Таким образом, вы можете устанавливать точки останова или регистрировать сообщения в некоторых методах объекта запроса и видеть, кто их вызывает.
Используйте параметр объекта pojo и настройте привязки.Похоже, гораздо более чистый способ чтения данных.