12

我想在我的 4 个支持 bean 中的 @PostConstruct 中进行重定向。正如我从以下问题中了解到的那样: JSF PostConstruct 异常处理 - 重定向 我知道我应该使用:

    @PostConstruct
    public void init() {    
       if (shouldRedirect) {
          try { 
             FacesContext.getCurrentInstance().getExternalContext().redirect("bolagsSok_company.xhtml");
             return;
          } catch (IOException e) {
             //do nothing
          }
        }
        ....
     }

这对我的 2 个支持 bean 非常有用……但对于另外两个,非重定向 xhtml 文件仍在调用支持 bean 并且不重定向。我已经确认(通过调试)支持 bean 确实调用了两者FacesContext.getCurrentInstance().getExternalContext().redirect("bolagsSok_company.xhtml");并返回;陈述。

有什么线索可能是错的吗?

4

1 回答 1

26

如果响应已经提交,则在 a 中重定向@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通过上下文参数将默认 Facelets 缓冲区大小web.xml增加到大约最大 HTML 响应的大小。

也可以看看:

于 2012-08-28T21:59:53.637 回答