2013-10-09 2 views
1

Это метод, который используется для обработки запроса ajax. Таким образом, выходной сигнал записывается в responseIllegalStateException: STREAM при вызове response.getWriter

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 
} 

Согласно this doc, я бы определенно есть IllegalStateException, если я позвоню getWriter, уже называется getOutputStream(), так что я подозреваю, что методы, которые я передал ответ на это сделал, хотя я на самом деле не вижу, чтобы они это делали ... Единственное, что можно сказать наверняка, - в какой-то момент один из методов может сделать response.sendError(). Как это называется getOutputStream()?

+0

Покажите нам «ModelAndView», который вы вернетесь, и если он сопоставляется с каким-либо другим ресурсом, например, 'jsp'. –

+0

Я полагаю, что это не должно быть «ModelAndView». Я вполне могу заменить его на 'void'. – 0x56794E

ответ

1

HttpServletResponse#sendError() передает ответ и отправляет код состояния ошибки. Состояние javadoc

Если ответ уже был зафиксирован, этот метод генерирует IllegalStateException. После использования этого метода ответ должен быть равен , который считается совершенным и не должен быть записан.

Другими словами, после вызова этого метода ответ HTTP в основном был отправлен. Нет смысла называть какие-либо из методов getOutputStream() или getWriter(). Ваш контейнер Servlet дополнительно делает его надежным, бросая исключение, если вы попытаетесь.

0

У меня были подобные проблемы, но до этого я не вызывал sendError(), а только setContentType(). Согласно this source, это может вызвать такое же поведение:

Я предполагаю, что его потому, что вы уже открыли поток, вызовом resp.setContentType («текст/обычный»); и затем пытается получить объект Writer. Вы можете использовать классы, основанные на потоке , или классы на основе Writer - не оба.

Либо удалите setContentType(), либо отправьте ответ, используя метод response.getOutputStream() . Это должно решить проблему.

И действительно, он разрешил аналогичную ошибку для меня.

Смежные вопросы