2011-04-14 64 views
0

在我的JSF应用程序中,我需要从托管bean构造函数重定向。我有下面的代码这样做:重定向表单托管bean构造函数抛出“java.lang.IllegalStateException”

HttpServletResponse httpServletResponse = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse(); 
httpServletResponse.sendRedirect("HomeV.jsf"); 

但这是抛出以下异常:

java.lang.IllegalStateException 
    at org.apache.catalina.connector.ResponseFacade.sendRedirect(ResponseFacade.java:435) 
    at javax.servlet.http.HttpServletResponseWrapper.sendRedirect(HttpServletResponseWrapper.java:126) 
    at com.sun.faces.context.ExternalContextImpl.redirect(ExternalContextImpl.java:419) 

我甚至尝试以下操作:

FacesContext.getCurrentInstance().getExternalContext().redirect("HomeV.jsf"); 

在与此相关的计算器问题中提及here但我仍面临同样的例外。

+0

相关:http://stackoverflow.com/questions/4032825/how-to-make-a-redirection-in-jsf/4099405#4099405但在这种特殊情况下,您似乎不需要导航的情况下。根据功能要求,我会使用过滤器。 – BalusC 2011-04-14 12:29:36

回答

2

不要在构造函数中这样做。我怀疑那里的回应是否处于适当的状态。也许你可以尝试在@PostConstruct这样做,但我不保证它会起作用。

理想情况下,您应该通过bean操作方法中的导航规则执行重定向。如果你想在多个动作上重定向,你可以使用一个PhaseListener

+0

+1,@Abhishek你可以添加更多信息你为什么这样做? – 2011-04-14 09:23:10

+0

我也尝试过这种导航规则。问题如下:我从bean的构造函数中调用一个方法,并编写导航以处理此方法的结果。该函数从bean中调用并按预期工作,但没有看到导航发生。我认为这不起作用的原因是,导航对所执行的操作起作用,而不是如果函数从其他函数调用。我的理解是正确的吗?有人可以建议任何其他方法 – 2011-04-14 10:01:59

+0

@Ahhishek是的,你是对的。构造函数是不应该用在像JSF/CDI这样的托管环境中的。为什么首先要重定向创建bean? – Bozho 2011-04-14 10:42:33

0

bean也可以在简单的上下文被初始化时创建,所以这不是一种合适的方法。

相关问题