【发布时间】: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 了,我想我只是记错了它是如何工作的。谢谢!