2

我正在尝试修复 JSF 应用程序中的一些错误,其中包括在“faces-config.xml”中声明的类“UserBean”的会话范围 bean“userBean”。其中一种方法有一行代码,如下所示:

public void doSomething() {
    ...
    UserBean userBean = (UserBean) facesContext.getApplication().evaluateExpressionGet(facesContext, "#{userBean}", UserBean.class);
    ...
}

有什么理由使用那个长表达式而不仅仅是“this”吗?或者,如果所有内容都正确声明,我是否可以确信正在执行该方法的实例实际上是与会话关联的 bean?

4

1 回答 1

2

您可以测试它是否是同一个 bean,只需比较引用并触发方法的执行以查看会发生什么:

public void doSomething() {
    UserBean userBean = (UserBean) facesContext.getApplication().
      evaluateExpressionGet(facesContext, "#{userBean}", UserBean.class);
    if (this == userBean){
        System.out.println("\nIt is the same bean, time for some cleanup!");
    } else {
        System.out.println("\nThere is something very weird going on here...");
    }
}

请记住,this并且userBean只是引用,指向内存中的一个区域。如果它们始终相同,您可以安全地将表达式替换为this.

如果有人首先在另一个地方编写代码,然后有人重构它,将这段代码移动到同一个 bean 并忘记更改此引用,我可以看到这种情况发生。

于 2012-08-04T19:00:18.277 回答