gpt4 book ai didi

jsf - @PostConstruct 中的重定向会导致 IllegalStateException

转载 作者:行者123 更新时间:2023-12-04 00:22:14 28 4
gpt4 key购买 nike

我想在我的 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 个支持 bean 非常有用......但对于另外两个,非重定向-xhtml 文件仍在调用支持 bean 并且不重定向。我已经确认(通过调试)支持 bean 确实调用了 FacesContext.getCurrentInstance().getExternalContext().redirect("bolagsSok_company.xhtml");并返回;声明。

任何线索可能是错误的?

最佳答案

@PostConstruct 中重定向如果响应已经提交,则可能为时已晚。即当响应的前几个字节已经发送到客户端时。这是一个不归路。在您的情况下,当第一次在 View 中相对较晚地引用(并因此构造)支持 bean 时,可能会发生这种情况,可能大约在一半或最后。
您可以通过以下方式之一解决此问题:

  • 尽早在 View 中第一次引用 bean。
  • 使用 <f:event type="preRenderView">而不是 @PostConstruct .这将在渲染响应开始之前调用该方法(因此,在任何位被发送到响应之前)。或者,当您已经使用 JSF 2.2 时,使用 <f:viewAction> .额外的好处是<f:viewAction>可以返回导航案例结果,如 return bolagsSok_company?faces-redirect=true"无需摆弄 ExternalContext#redirect() .
  • 将默认 Facelets 缓冲区大小增加 javax.faces.FACELETS_BUFFER_SIZE web.xml 中的上下文参数大约是最大的 HTML 响应的大小。

  • 另见:
  • Hit a bean method and redirect on a GET request
  • Is there any easy way to preprocess and redirect GET requests?
  • How to navigate in JSF? How to make URL reflect current page (and not previous one)
  • 关于jsf - @PostConstruct 中的重定向会导致 IllegalStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12168043/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com