我想在我的4个支持bean中的@PostConstruct中进行重定向。正如我从以下问题中学到的: JSF PostConstruct Exception Handling - Redirect 我知道我应该使用:
@PostConstruct
public void init() {
if (shouldRedirect) {
try {
FacesContext.getCurrentInstance().getExternalContext().redirect("bolagsSok_company.xhtml");
return;
} catch (IOException e) {
//do nothing
}
}
....
}
这适用于我的2个Backing bean ...但是对于其他两个,非重定向的xhtml文件仍然调用支持bean而不重定向。我已经确认(使用调试),支持bean确实调用FacesContext.getCurrentInstance().getExternalContext().redirect("bolagsSok_company.xhtml");
并返回;声明。
任何可能出错的线索?
答案 0 :(得分:24)
如果响应已经提交,则在@PostConstruct
中重定向可能为时已晚。即当响应的前几个字节已经发送到客户端时。这是一个不归路。在你的情况下,可以在视图中相对较晚的时候第一次引用(并因此构造)支持bean时发生,可能是大约一半或最后。
您可以通过以下方式之一解决此问题:
在视图中尽可能早地引用bean。
使用<f:event type="preRenderView">
代替@PostConstruct
。这将在渲染响应开始之前调用该方法(因此,在将任何位发送到响应之前)。或者,当您使用JSF 2.2时,请使用<f:viewAction>
。另外一个好处是,<f:viewAction>
可以返回return bolagsSok_company?faces-redirect=true"
之类的导航案例结果,而无需使用ExternalContext#redirect()
。
将javax.faces.FACELETS_BUFFER_SIZE
中的web.xml
上下文参数的默认Facelets缓冲区大小增加到大约最大HTML响应的大小。