Ошибка «getOutputStream() уже был вызван для этого ответа» при изменении ответаJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Ошибка «getOutputStream() уже был вызван для этого ответа» при изменении ответа

Сообщение Anonymous »

В моем приложении весенней загрузки есть два фильтра.
Один из фильтров, RequestResponseLoggingFilter, предназначен для регистрации запросов и ответов. Этот фильтр должен выполняться последним. Я не могу изменить его порядок

Код: Выделить всё

@Component
@Order(10000)
@Slf4j
@RequiredArgsConstructor
public class RequestResponseLoggingFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(
HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
if (requestResponseLoggingEnabled) {
if (isAsyncDispatch(request)) {
filterChain.doFilter(request, response);
} else {
doFilterWrapped(wrapRequest(request), wrapResponse(response), filterChain);
}
} else {
filterChain.doFilter(request, response);
}
}

protected void doFilterWrapped(
ContentCachingRequestWrapper request,
ContentCachingResponseWrapper response,
FilterChain filterChain)
throws ServletException, IOException {
LocalDateTime requestProcessingTime = null;
try {
requestProcessingTime = LocalDateTime.now();
filterChain.doFilter(request, response);
} finally {
logRequestAndResponse(request, response, MDC.get(JwtFilter.TRACE_ID), requestProcessingTime);
response.copyBodyToResponse();
}
}
private static ContentCachingRequestWrapper wrapRequest(HttpServletRequest request) {
if (request instanceof ContentCachingRequestWrapper) {
return (ContentCachingRequestWrapper) request;
} else {
return new ContentCachingRequestWrapper(request);
}
}

private static ContentCachingResponseWrapper wrapResponse(HttpServletResponse response) {
if (response instanceof ContentCachingResponseWrapper) {
return (ContentCachingResponseWrapper) response;
} else {
return new ContentCachingResponseWrapper(response);
}
}
}
У меня также есть еще один фильтр с именем JwtFilter, в обязанности которого входит выполнение некоторых задач аутентификации. В этом фильтре в некоторых местах кода после вызова doFilter мне нужно изменить ответ. Когда я изменил ответ, я получил ошибку "java.lang.IllegalStateException: getOutputStream() уже был вызван для этого ответа".

Код: Выделить всё

@RequiredArgsConstructor
@Slf4j
public class JwtFilter extends OncePerRequestFilter {

@Override
protected void doFilterInternal(
HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {

.....

filterChain.doFilter(request, response);

....
//this is where I modify the response
ResponseEntity responseEntity =
globalExceptionHandler.defaultErrorHandler(request, response, e);
response.setStatus(responseEntity.getStatusCodeValue());
response.addHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE);
response.getWriter().write(objectMapper.writeValueAsString(responseEntity.getBody()));
}

Это трассировка стека

Код: Выделить всё

java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:572)
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:189)
at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:108)
at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:108)
at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:108)
at org.springframework.security.web.util.OnCommittedResponseWrapper.getWriter(OnCommittedResponseWrapper.java:156)
at com.innovance.config.security.JwtFilter.handleException(JwtFilter.java:136)
at com.innovance.config.security.JwtFilter.doFilterInternal(JwtFilter.java:114)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)

Не могли бы вы помочь мне определить причину проблемы и сообщить, как ее исправить?

Подробнее здесь: https://stackoverflow.com/questions/787 ... ile-modiyi
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Easyexcel IllegalStateException: getOutputStream() уже был вызван для этого ответа
    Anonymous » » в форуме JAVA
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Spring: getOutputStream() уже был вызван для этого ответа
    Anonymous » » в форуме JAVA
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Java.lang.illegalstateException: getReader () уже был вызван для этого запроса
    Anonymous » » в форуме JAVA
    0 Ответы
    1 Просмотры
    Последнее сообщение Anonymous
  • Изображение сжимается при изменении размера браузера по высоте, но не при изменении ширины.
    Гость » » в форуме CSS
    0 Ответы
    189 Просмотры
    Последнее сообщение Гость
  • WPF DataGrid IValueConverter срабатывает только при изменении выбранного элемента, а не при изменении связанного значени
    Anonymous » » в форуме C#
    0 Ответы
    56 Просмотры
    Последнее сообщение Anonymous

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