Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / [JSF] Ошибка "getOutputStream() has been called for the response" после redirect'a / 6 сообщений из 6, страница 1 из 1
10.10.2012, 17:20:54
    #37992201
Viktor Grafskiy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[JSF] Ошибка "getOutputStream() has been called for the response" после redirect'a
Здравствуйте, помогите пожалуйста.
В бине я устанавливаю атрибут сессии для последующего получения данного атрибута в сервлете. После этого я делаю redirect на этот сервлет, к сожалению вместо получения ожидаемого отчета, который должен формироваться в сервлете, в логе сервера я вижу ошибку:
Код: java
1.
2.
3.
4.
5.
6.
7.
StandardWrapperValve[Faces Servlet]: PWC1406: Servlet.service() for servlet Faces Servlet threw exception
java.lang.IllegalStateException: PWC3991: getOutputStream() has already been called for this response
	at org.apache.catalina.connector.Response.getWriter(Response.java:705)
	at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:225)
	at com.sun.faces.context.ExternalContextImpl.getResponseOutputWriter(ExternalContextImpl.java:723)
	at com.sun.faces.context.PartialViewContextImpl.createPartialResponseWriter(PartialViewContextImpl.java:431)
	........И ещё много нецензурщины.......


А вот и тот код, который вызывает ошибку
Backed bean:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public void createReport() {
	FacesContext ctx = FacesContext.getCurrentInstance();
	ExternalContext ec = ctx.getExternalContext();
	HttpServletResponse response = (HttpServletResponse) ec.getResponse();
	HttpServletRequest request =  (HttpServletRequest) ec.getRequest();
	Map<String, Object> params = getReportParams();
	request.getSession().setAttribute("reportData", params);
	try {
	    request.getRequestDispatcher("AmexReportView.jsf").forward(request, response);
	} catch { БАБАХ!!! }
}


Сервлет:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
	res.setContentType("text/html;charset=UTF-8");
	res.setHeader("Content-disposition", "inline");
	ServletOutputStream servletOutputStream = res.getOutputStream();		
	String jasperFile = getClass().getResource("/reports/amex/AMEXReport.jasper").getPath();			
	JRBeanCollectionDataSource ds = new JRBeanCollectionDataSource(new Vector<AmexReportBean>());
	req.getSession().removeAttribute("reportData");
	JasperPrint print = null;
	try {
	     print = JasperFillManager.fillReport(jasperFile, null, ds);
	} catch (JRException e) { БДЫЩ!!!! }		
		
	byte[] htmlStream = exportReportToHtmlStream(print);		
	servletOutputStream.write(htmlStream);
	servletOutputStream.flush();
	servletOutputStream.close();
}


Я просмотрел кучу форумов, где есть упоминание про эту ошибку, но не смог найти ответа применительно к моей ситуации, я так понимаю, что на объекте HttpServletResponse, который получает сервлет уже вызывался метод getOutputStream() - я сам передаю уже "юзанный" респонс в методе форвард request.getRequestDispatcher("AmexReportView.jsf").forward(request, response ); А вот как мне сделать редирект не передавая response я не понимаю.
...
Рейтинг: 0 / 0
10.10.2012, 17:32:54
    #37992225
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[JSF] Ошибка "getOutputStream() has been called for the response" после redirect'a
Вы делаете форвард - а говорите про редирект, точно понимаете разницу между ними?
...
Рейтинг: 0 / 0
10.10.2012, 17:36:15
    #37992234
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[JSF] Ошибка "getOutputStream() has been called for the response" после redirect'a
Хотя ладно во избежание дальнейших вопросов

Код: java
1.
2.
3.
4.
5.
	

FacesContext context = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse)context.getExternalContext().getResponse();
response.sendRedirect("somePage.jsp");
...
Рейтинг: 0 / 0
11.10.2012, 11:53:33
    #37993362
Viktor Grafskiy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[JSF] Ошибка "getOutputStream() has been called for the response" после redirect'a
забыл никВы делаете форвард - а говорите про редирект, точно понимаете разницу между ними?
Вы правы, уважаемый забыл ник, не очень то понимал. Я поменял код:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
public void createReport() {
	FacesContext ctx = FacesContext.getCurrentInstance();
	ExternalContext ec = ctx.getExternalContext();
	HttpServletResponse response = (HttpServletResponse) ec.getResponse();
	HttpServletRequest request =  (HttpServletRequest) ec.getRequest();
	Map<String, Object> params = getReportParams();
	request.getSession().setAttribute("reportData", params);
	try {
		response.sendRedirect("AmexReportView.jsf");
	} catch (IOException e) { ... }
}


К сожалению, когда я заменил строку, моя страница перестала перегружаться, т.е. я вижу в дебагере что код сервлета выполняется, но jsf-страница на которой расположена кнопка "Просмотр отчета" остается на месте, а по задумке браузер должен переходить на сервлет. Вот как я дергаю указанную функцию из jsf страницы:
Код: html
1.
2.
	...
<p:commandButton value="Просмотр" action="#{amexReportBean.createReport}" />

Подскажите пожалуйста, где я ошибся?
...
Рейтинг: 0 / 0
11.10.2012, 12:08:49
    #37993405
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[JSF] Ошибка "getOutputStream() has been called for the response" после redirect'a
А зачем вам тут вообще программный редирект? Почитайте про навигацию в jsf - тут типичный случай из метода action вернете строку, по которой jsf сам отрендерит нужный вью
...
Рейтинг: 0 / 0
11.10.2012, 15:11:45
    #37993882
Viktor Grafskiy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
[JSF] Ошибка "getOutputStream() has been called for the response" после redirect'a
Разобрался! Забыл вставить строчку ajax="false" в параметрах commandButton'а.
забыл никА зачем вам тут вообще программный редирект? Почитайте про навигацию в jsf - тут типичный случай из метода action вернете строку, по которой jsf сам отрендерит нужный вью
Вот именно так я и делал с самого начала, до того как написал сообщение на форуме. Такая схема у меня не заработала, т.к. оказывается, что нельзя просто так сделать редирект с jsf страницы на сервлет, указав одно лишь имя страницы. Необходимо использовать ту конструкцию, что Вы мне и подсказали
Код: java
1.
2.
3.
4.
5.
	try {
	response.sendRedirect("AmexReportView.jsf");
	// или FacesContext.getCurrentInstance().getExternalContext().redirect("needed_url");

} catch (IOException e) { ... }

забыл ник , спасибо Вам огромное! Я два дня с этой глупостью проковырялся.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / [JSF] Ошибка "getOutputStream() has been called for the response" после redirect'a / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]