JSF2.x中的异常处理,从另一个访问SessionScoped托管bean并重定向

JSF2.x中的异常处理,从另一个访问SessionScoped托管bean并重定向,jsf,redirect,exception-handling,Jsf,Redirect,Exception Handling,我做了一些关于如何做到这一点的研究,我发现了一些孤立的解决方案,但我无法弄清楚,如何将它们结合起来,以及什么样的方式是最佳实践。我正在使用tomcat和JSF2.x 情景: 我有一个会话范围的bean,mycontrollerA。控制器与myviewa.xhtml相关。在viewA上点击commandLink后,触发了mycontrollerA.doThis()操作。在这个方法中,我想使用try-catch,如果发生异常,我想重定向到我的异常报告视图“exception.xhtml”。相关控制器

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

情景: 我有一个会话范围的bean,mycontrollerA。控制器与myviewa.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方法,应该创建它。

首先,是否有任何特殊原因使mycontrollerAbean被
@SessionScope
?我这样问是因为看起来您正在将其与特定视图链接,因此使用
@viewscope
注释更方便。话虽如此,您可以使用
@ManagedProperty
注释从
@ViewScoped
引用
@SessionScoped
bean。但是请记住,除非您这样做,否则这个bean不会被初始化。