IllegalStateException:STREAM при вызове response.getWriter
Это метод, который используется для обработки запроса AJAX. Таким образом, вывод записывается в response
public ModelAndView myAction(HttpServletRequest request, HttpServletResponse response, BindException errors) throws Exception
{
//call other methods and send the response as arg
//call getWriter on the response
}
Согласно этому документу, у меня определенно будет IllegalStateException, если я вызову getWriter, уже вызвавший getOutputStream(), поэтому я подозреваю, что методы, на которые я передал ответ, сделали это, хотя я на самом деле не вижу, как они это делают... Единственное, что наверняка это то, что в какой-то момент один из методов может сделать response.sendError(). Это как-то вызывает getOutputStream()?
2 ответа
HttpServletResponse#sendError()
фиксирует ответ и отправляет код ошибки. Javadoc заявляет
Если ответ уже был принят, этот метод генерирует исключение IllegalStateException. После использования этого метода ответ должен считаться зафиксированным и не должен записываться.
Другими словами, после вызова этого метода HTTP-ответ в основном был отправлен. Нет смысла называть кого-либо из getOutputStream()
или же getWriter()
методы. Ваш Servlet
Кроме того, контейнер делает его надежным, создавая исключение, если вы пытаетесь.
У меня были подобные проблемы, но я не вызывал sendError(), просто перед этим установил setContentType(). Согласно этому источнику, он может вызвать такое же поведение:
Я предполагаю, потому что вы уже открыли поток, вызвав resp.setContentType("text/plain"); метод, а затем пытаются получить объект Writer. Вы можете использовать классы, основанные на потоке, или классы, основанные на Writer, но не оба.
Либо удалите setContentType(), либо отправьте ответ, используя метод response.getOutputStream(). Это должно решить проблему.
И действительно, это решило подобную ошибку для меня.