getOutputStream () уже был вызван для этого ответа при использовании PrintWriter - PullRequest
0 голосов
/ 04 февраля 2019

Я работаю над этим приложением Java Sprint 3.0, где я передаю данные в таблицу данных.Все работает нормально, но время от времени я вижу эту ошибку:

ERROR [[dispatcher]] Servlet.service() for servlet dispatcher threw exception
java.lang.IllegalStateException: getOutputStream() has already been called

для этого ответа.

Вот мой код:

@PreAuthorize("hasRole('ADMIN')")
@RequestMapping(value = "/dataTable", method = RequestMethod.GET)
public void serverSide(Model model, HttpServletRequest request, HttpServletResponse response) throws IOException {

  response.setContentType("application/json");
  response.setHeader("Cache-Control", "no-store");

  PrintWriter out = response.getWriter();
  out.print(dataTableService.viewUsers(request));
}

Я попытался добавить следующее:

out.flush();
out.close();
return;

Я также попытался использовать response.getOutputStream() .print (dataTableService.viewUsers (request)) и response.getWriter (). append (dataTableService.viewUsers (request)) вместо использования PrintWriter но, похоже, ничего не исправить.

РЕДАКТИРОВАТЬ:

Вот трассировка стека: enter image description here

1 Ответ

0 голосов
/ 04 февраля 2019

Основы:

  1. заголовки должны быть написаны в первую очередь;
  2. , затем содержимое должно быть написано с использованием getOutputStream или getWriter.

Что еще может пойти не так:

  • Основные ошибки, такие как response.getOutputStream() и response.getWriter() - здесь очень маловероятно.

  • Поток управления:

    if (...) {
        ... redirect
        // Missing return
    }
    ... normal output
    
  • Фильтр или перехватчик: обычно маловероятно;хотя здесь есть аннотации.

    out.flush(); // OKAY
    // Probably NOT OKAY: out.close();
    
  • Servlet поля используются.Методы обслуживания должны быть сами по себе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...