JSF 2中的ExceptionHandling.x,从另一个访问SessionScoped管理bean并重定向



我做了一些关于如何做到这一点的研究,我发现了一些孤立的解决方案,但我无法弄清楚,如何将它们结合起来,以及什么方式是最佳实践。我使用tomcat和jsf 2.x。

场景:我有一个会话作用域bean mycontrollerA。控制器与myview .xhtml相关。在viewA上点击commandLink后,mycontrollerA.doThis()操作被触发。在这个方法中,我想使用try-catch,如果发生异常,我想重定向到我的异常报告视图'exception.xhtml'。相关的控制器ExceptionController有一个属性'message',我想在myControllerA中设置相应的值。

问题:我得到了一个错误,如果我试图抓住我的exceptionController bean。我猜,它不存在,因为它从来没有初始化过。我希望有一种常见的方法从另一个SessionScoped bean中抓取SessionScoped bean,它可以处理这种"必要时创建"的开箱即用行为。此外,我认为我的重定向代码可以改进。

提前感谢。

public String doThis() {
    try {
        throw new RuntimeException("TestExc");
} catch (RuntimeException e) {
    //ExceptionController exceptionController = (ExceptionController) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("exceptionController");
    //exceptionController.setMessage("Fehlerinfo: " + e.getMessage());
    try {
        FacesContext.getCurrentInstance().getExternalContext().redirect("exception.xhtml");
        } catch (IOException e1) {
            e1.printStackTrace();
        } 
    }
    return null;
}
@ManagedBean(name = "exceptionController")
@SessionScoped
public class ExceptionController { ... }

您可以尝试通过ELResolver来解析bean:

FacesContext fc = FacesContext.getCurrentInstance();
ELContext el = fc.getELContext();
ExceptionController exCtrl = (ExceptionController) el.getELResolver()
    .getValue(el, null, "exceptionController");

您的问题可能是,bean之前没有创建,因此它还没有在会话中。使用ELResolver方法应该创建它

相关内容

  • 没有找到相关文章

最新更新