@PostConstruct中的重定向导致IllegalStateException

时间:2012-08-28 21:52:31

标签: jsf jsf-2

我想在我的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");并返回;声明。

任何可能出错的线索?

1 个答案:

答案 0 :(得分:24)

如果响应已经提交,则在@PostConstruct中重定向可能为时已晚。即当响应的前几个字节已经发送到客户端时。这是一个不归路。在你的情况下,可以在视图中相对较晚的时候第一次引用(并因此构造)支持bean时发生,可能是大约一半或最后。

您可以通过以下方式之一解决此问题:

  1. 在视图中尽可能早地引用bean。

  2. 使用<f:event type="preRenderView">代替@PostConstruct。这将在渲染响应开始之前调用该方法(因此,在将任何位发送到响应之前)。或者,当您使用JSF 2.2时,请使用<f:viewAction>。另外一个好处是,<f:viewAction>可以返回return bolagsSok_company?faces-redirect=true"之类的导航案例结果,而无需使用ExternalContext#redirect()

  3. javax.faces.FACELETS_BUFFER_SIZE中的web.xml上下文参数的默认Facelets缓冲区大小增加到大约最大HTML响应的大小。

  4. 另见: