0

我对如何完成这项工作进行了一些研究,找到了一些孤立的解决方案,但我无法弄清楚如何将它们结合起来,以及最佳实践是哪种方式。我正在使用 tomcat 和 jsf 2.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 { ... }
4

1 回答 1

1

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

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

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

于 2013-04-13T09:04:07.810 回答