表达式语言 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" 策略。相反,它有一组循环通过的接口 - MapDataObject 等(我不记得具体顺序) - 如果对象匹配其中一个,它将专门使用该路线。你在那里所做的,经过反思,与我用来获得这种行为的策略相同。