Spring Boot 3.4.2: ContentCachingRequestWrapper Возвращает исчерпанный входной поток после того, как тело запроса было пJAVA

Программисты JAVA общаются здесь
Anonymous
Spring Boot 3.4.2: ContentCachingRequestWrapper Возвращает исчерпанный входной поток после того, как тело запроса было п

Сообщение Anonymous »

Я работаю над приложением Spring Boot (3.4.2), где я использую ContentCachingRequestWrapper, чтобы разрешить несколько чтений корпуса запроса. Тем не менее, я сталкиваюсь с проблемой, когда после того, как тело запроса было прочитано один раз (например, фильтром или перехватчиком), все последующие считывания возвращают пустой поток (read () == -1).
Что происходит? < /strong> < /p>

[*] Фильтр или перехватчик завершает запрос в ContentCachingRequestWrapper. < /li>
Более ранний компонент (в моем случае, предварительный хранд, который анализирует запрос для определения его типа) читает тело после использования request.getReader (), что делает вложенные вызовы в пользовательский класс CachedBodyServletRequest (на основе https://www.baeldung.com/spring-reading ... tiple-time)
Позже в цепочке фильтров, когда Spring пытается выполнить readwithmessageconverter , который, в свою очередь, вызывает запрос. Это возвращает -1, что заставляет последующую логику выйти из строя, поскольку тело является нулевым, а последующее исключение httpmessagenotReadable. >
< /ul>
public ServletInputStream getInputStream() throws IOException {
if (this.inputStream == null) {
this.inputStream = new ContentCachingInputStream(getRequest().getInputStream());
}
return this.inputStream;
}
< /code>
Поскольку inputstream не является нулевым после первого чтения в предыдущем предварительном хрантере, пружина возвращает тот же (теперь истощенный) поток вместо создания нового.
Однако GetContentAsByTearRay () по -прежнему содержит корпус полного запроса. < /p>
Поскольку ContentCachingRequestWrapper кэширует корпус запроса, я ожидал, что getInputStream () возвращает свежий входной направление, которое можно читать несколько раз - как и getContentAsByTearray ().
наблюдаемое поведение [/b]
Если компонент считывает тело рано, последующие вызовы getInputStream () Возврат пустой поток ( read () == -1).
Spring, кажется, не обновляет InputStream, даже если тело кэшируется. > Если да, то лучший способ сбросить или обновить поток ввода для последующего чтения?

Подробнее здесь: https://stackoverflow.com/questions/794 ... nputstream

Вернуться в «JAVA»