我正在尝试修复JSF应用程序中的一些错误,其中包括在“faces-config.xml”中声明的类“UserBean”的会话范围的bean“userBean”。其中一种方法的代码如下:
public void doSomething() {
...
UserBean userBean = (UserBean) facesContext.getApplication().evaluateExpressionGet(facesContext, "#{userBean}", UserBean.class);
...
}
有没有理由使用那个长表达而不仅仅是“这个”?或者,如果一切都被正确声明,我是否可以确信方法正在执行的实例实际上是与会话相关联的bean?
答案 0 :(得分: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并忘记更改此引用,我可以看到这种情况发生。