表达式语言 bean 属性 求值顺序
Expression Language bean property evaluation order
给定一个扩展抽象 class (AbstractMapModel) 的托管 bean (MyBean),它本质上是 Map 的包装器:
AbstractMapModel class 包含一个 getValue(Object key) 方法。
MyBean class 包含一个 getName() 方法。
XPage 的值计算为#{MyBean.name}。
我发现它调用 MyBean.getValue("Name") 并忽略 MyBean.getName()。我的问题是,这是正确的操作吗?
从逻辑上讲,似乎应该先尝试更具体的 getName(),然后再尝试通用的 getValue("Name")。做一些研究,似乎如果 getValue() returns null,它应该寻找一个特定的 getter,即使我发现逻辑可疑,至少会得到正确的最终结果。然而,两者都没有发生。
我已经用下面的代码解决了这个问题:
public Object getValue(final Object key) {
/* Following code added to check for specific getter before performing getValues() */
String propertyName = key.toString();
propertyName = propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1);
Method method = null;
try {
method = this.getClass().getMethod("get" + propertyName, new Class[] {});
if (method != null) {
return method.invoke(this);
}
} catch (Exception e) {
// Do nothing
}
try {
method = this.getClass().getMethod("is" + propertyName, new Class[] {});
if (method != null) {
return method.invoke(this);
}
} catch (Exception e) {
}
/* --------------------------------------------- */
return getValues().get(key);
}
似乎不需要此解决方法,所以我想知道我是否对正在发生的事情有一些根本性的误解。或者,有没有更好的方法我应该这样做?
尽管它通常很有用,但 EL 并不遵循这样的 "fallback" 策略。相反,它有一组循环通过的接口 - Map
、DataObject
等(我不记得具体顺序) - 如果对象匹配其中一个,它将专门使用该路线。你在那里所做的,经过反思,与我用来获得这种行为的策略相同。
给定一个扩展抽象 class (AbstractMapModel) 的托管 bean (MyBean),它本质上是 Map 的包装器:
AbstractMapModel class 包含一个 getValue(Object key) 方法。
MyBean class 包含一个 getName() 方法。
XPage 的值计算为#{MyBean.name}。
我发现它调用 MyBean.getValue("Name") 并忽略 MyBean.getName()。我的问题是,这是正确的操作吗?
从逻辑上讲,似乎应该先尝试更具体的 getName(),然后再尝试通用的 getValue("Name")。做一些研究,似乎如果 getValue() returns null,它应该寻找一个特定的 getter,即使我发现逻辑可疑,至少会得到正确的最终结果。然而,两者都没有发生。
我已经用下面的代码解决了这个问题:
public Object getValue(final Object key) {
/* Following code added to check for specific getter before performing getValues() */
String propertyName = key.toString();
propertyName = propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1);
Method method = null;
try {
method = this.getClass().getMethod("get" + propertyName, new Class[] {});
if (method != null) {
return method.invoke(this);
}
} catch (Exception e) {
// Do nothing
}
try {
method = this.getClass().getMethod("is" + propertyName, new Class[] {});
if (method != null) {
return method.invoke(this);
}
} catch (Exception e) {
}
/* --------------------------------------------- */
return getValues().get(key);
}
似乎不需要此解决方法,所以我想知道我是否对正在发生的事情有一些根本性的误解。或者,有没有更好的方法我应该这样做?
尽管它通常很有用,但 EL 并不遵循这样的 "fallback" 策略。相反,它有一组循环通过的接口 - Map
、DataObject
等(我不记得具体顺序) - 如果对象匹配其中一个,它将专门使用该路线。你在那里所做的,经过反思,与我用来获得这种行为的策略相同。