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(). Это должно решить проблему.

И действительно, это решило подобную ошибку для меня.

Другие вопросы по тегам