【问题标题】:Expression Language bean property evaluation order表达式语言 bean 属性评估顺序
【发布时间】:2016-04-14 16:34:24
【问题描述】:

给定一个托管 bean (MyBean),它扩展了一个抽象类 (AbstractMapModel),它本质上是一个 Map 的包装器:

AbstractMapModel 类包含一个 getValue(Object key) 方法。

MyBean 类包含一个 getName() 方法。

XPage 有一个计算结果为 #{MyBean.name} 的值。

我发现它调用了 MyBean.getValue("Name") 并忽略了 MyBean.getName()。我的问题是,这是正确的操作吗?

从逻辑上讲,它似乎应该在尝试通用 getValue("Name") 之前尝试更具体的 getName()。做一些研究,似乎如果 getValue() 返回 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);
}

似乎不需要这种解决方法,所以我想知道我是否对正在发生的事情有一些基本的误解。或者,我应该这样做有更好的方法吗?

【问题讨论】:

  • 我已经很久没有看到它了,但是如果我没记错的话,Tim Tripcony 为 NotesIn9 制作了一个关于这个的视频,并谈到了这个确切的问题。基本上任何蒂姆的建议都是最好的解决方案。
  • 我所做的一切源于蒂姆的工作。我已经有一段时间没有审查过 NI9 了,我想我只是记错了它是如何工作的。谢谢!

标签: jsf xpages el


【解决方案1】:

尽管它通常很有用,但 EL 并不遵循这样的“后备”策略。相反,它有一组循环通过的接口——MapDataObject 等(我不记得具体的顺序)——如果对象与其中一个匹配,它将专门使用该路由.您在那里所做的反思与我用来获得这种行为的策略相同。

【讨论】:

  • 假设,您可以在列表的开头注册一个新的处理程序,该处理程序将接受任何对象并对其进行“回退”排序,但这可能太老套了,不值得。
  • 我尝试编写代码以尽量减少 hackiness,所以我想我会坚持使用这种方法。有没有理由不这样做,比如性能不佳或其他什么?我正在尝试确定它是否属于抽象类,或者我是否应该根据具体情况覆盖该行为。我可以覆盖我的 getValue 以查找特定的键,然后返回该方法,而不是从地图中查找值。但是那个代码看起来真的很难看。
  • 在它变成一个实际问题之前,没有任何理由担心反射的性能 - 虽然与整数测试相比,反射是“慢”的,但与任何与数据库相关的东西相比,它都非常快.我已经使用这条路线有一段时间了,不必三思而后行。如果它确实被证明太慢,那么您的“检查特定键”路线就是要走的路 - 这就是 IBM 的对象(如 DominoViewEntry)所做的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
  • 2021-11-08
  • 1970-01-01
相关资源
最近更新 更多