按照answer of BalusC,我用重定向在@PostConstruct方法导致IllegalStateException异常
FacesContext.getCurrentInstance().getExternalContext().redirect(url);
在我@PostConstruct
方法从渲染视图停止JSF和重定向用户。但是,当我尝试运行代码时,我仍然遇到上述行中的java.lang.IllegalStateException
异常。
WARNING: StandardWrapperValve[Faces Servlet]: PWC1406: Servlet.service() for servlet Faces Servlet threw exception
java.lang.IllegalStateException
at org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:524)
at StudentManagedBean.CourseSummary.init(CourseSummary.java:55)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
更新:我添加了以下线在我@PostConstruct
方法:
System.out.println("INIT " + FacesContext.getCurrentInstance().getExternalContext().isResponseCommitted());
和我所看到的是INIT true
。我想知道在调用@PostConstruct
方法之前是否应该提交响应?
如果您能给我一个建议,我将不胜感激。
我非常肯定,即使在PostConstruct中完成了Response,JSF生命周期的其余部分仍然会被执行。你从构造函数中得到这个错误吗?这是一个Ajax请求吗?你使用的是什么JSF实现和版本? – 2012-07-25 11:06:59
我正在使用JSF 2.0。另外,我必须在'@ PostConstruct'中执行,因为我需要在重定向之前从我的EJB中调用一个函数。这也不是AJAX请求。 – 2012-07-25 11:11:09
响应已被提交,因为响应头已被FacesServlet操纵。这与完成的响应不同,这意味着主体已经写入并完成,直到渲染阶段才发生。在响应提交后的任何时候重定向将导致IllegalStateException,因此您唯一的选择是转发。 – 2012-07-25 14:18:53