问题描述
我想在4个支持bean中的@PostConstruct中进行重定向.正如我从以下问题中学到的: JSF PostConstruct异常处理-重定向我知道我应该使用:
I want to make a redirect in my @PostConstruct in 4 of my backing beans. As I've learned from the follwoing question:JSF PostConstruct Exception Handling - RedirectI know that I'm supposed to use:
@PostConstruct
public void init() {
if (shouldRedirect) {
try {
FacesContext.getCurrentInstance().getExternalContext().redirect("bolagsSok_company.xhtml");
return;
} catch (IOException e) {
//do nothing
}
}
....
}
这对于我的两个Backing Bean来说效果很好...但是对于其他两个,non-redirected-xhtml文件仍在调用Backing Bean,并且不会重定向.我已经(通过调试)确认了支持Bean确实调用了FacesContext.getCurrentInstance().getExternalContext().redirect("bolagsSok_company.xhtml");
并返回了;陈述.
This works great for 2 of my Backing beans... but for the other two, the non-redirected-xhtml file is still making calls to the backing bean and doesn't redirect. I've confirmed (with debug) that the backing beans indeed calls both FacesContext.getCurrentInstance().getExternalContext().redirect("bolagsSok_company.xhtml");
and return; statements.
任何提示可能有什么问题吗?
Any clues what could be wrong?
推荐答案
如果响应已经提交,则在@PostConstruct
中重定向可能为时已晚. IE.当响应的前几个字节已经发送到客户端时.这是无可挽回的一点.在您的情况下,当在视图中相对较后的位置第一次引用(并因此构造)后备bean时可能会发生这种情况,可能大约是在中间或最后.
Redirecting in a @PostConstruct
might be too late if the response is already committed. I.e. when the first few bytes of the response are already been sent to the client. This is a point of no return. That can in your case happen when the backing bean is referenced (and thus constructed) for the first time relatively late in the view, maybe about halfway or in the end.
您可以通过以下方式之一解决此问题:
You could solve this in one of the following ways:
-
在视图中尽可能早地第一次引用该bean.
Reference the bean for the first time as early as possible in the view.
使用<f:event type="preRenderView">
代替@PostConstruct
.这将在渲染响应开始之前(因此,在将任何位发送到响应之前)调用该方法.或者,如果您已经在使用JSF 2.2,请使用<f:viewAction>
.另一个优点是<f:viewAction>
可以返回类似return bolagsSok_company?faces-redirect=true"
的导航案例结果,而无需摆弄ExternalContext#redirect()
.
Use <f:event type="preRenderView">
instead of @PostConstruct
. This will invoke the method right before the render response starts (thus, before any bit is been sent to the response). Or, when you're on JSF 2.2 already, use the <f:viewAction>
. Additional advantage is that the <f:viewAction>
can return a navigation case outcome like return bolagsSok_company?faces-redirect=true"
without the need to fiddle with ExternalContext#redirect()
.
通过web.xml
中的javax.faces.FACELETS_BUFFER_SIZE
上下文参数将默认Facelets缓冲区大小增加到最大HTML响应的大小.
Increase the default Facelets buffer size by javax.faces.FACELETS_BUFFER_SIZE
context param in web.xml
to about the size of the largest HTML response.
另请参见:
- 使用Bean方法并重定向到GET请求
- 是否有任何简便的预处理方法并重定向GET请求?
- 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)
See also:
这篇关于@PostConstruct中的重定向导致IllegalStateException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!