【问题标题】:Redirect form managed bean constructor throwing "java.lang.IllegalStateException"重定向表单托管 bean 构造函数抛出“java.lang.IllegalStateException”
【发布时间】:2011-08-05 08:39:50
【问题描述】:

在我的 JSF 应用程序中,我需要从托管 bean 构造函数进行重定向。我有以下代码:

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 相关的 stackoverflow 问题中所述,但我仍然面临同样的异常。

【问题讨论】:

标签: java jsf javabeans httpresponse


【解决方案1】:

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

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

【讨论】:

  • +1 ,@Abhishek 您可以添加更多信息,为什么要这样做?
  • 我也尝试过使用导航规则。问题如下:我从 bean 的构造函数中调用了一个方法,并编写了导航来处理该方法的结果。该函数从 bean 调用并按预期工作,但看不到导航发生。我认为这不起作用的原因是,导航适用于执行的操作,而不是从其他函数调用该函数。我的理解对吗?有人可以建议任何其他方法
  • @Abhishek 是的,你是对的。构造函数不应该在像 JSF/CDI 这样的托管环境中使用。为什么首先要重定向 bean 创建?
【解决方案2】:

也可以在简单的上下文初始化时创建 Bean,所以这根本不是正确的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-18
    • 2023-03-03
    • 2013-03-05
    • 2012-10-12
    • 2013-11-30
    • 2013-07-13
    相关资源
    最近更新 更多