【发布时间】:2011-12-20 09:17:35
【问题描述】:
我有一个基类ReportElement,它具有type 属性:
public abstract class ReportElement {
private ReportElementType type;
public ReportElementType getType() {
return type;
}
public void setType(ReportElementType type) {
this.type = type;
}
}
ReportElementType 只是一个枚举,每个元素都有指定的code 和i18nKey 属性。我有几个ReportElement 的子类,每个子类都引入了自己的属性。其中之一是情节:
public class Plot extends ReportElement {
public Plot() {
setType(ReportElementType.PLOT);
}
private Collection<Parameter> parameters = new ArrayList<Parameter>();
public Collection<Parameter> getParameters() {
return parameters;
}
}
在某些页面上我需要显示不同ReportElement 实例的集合,所以我只使用了struts2 选择标签:
<s:select list="myElements" listKey="type.code" listValue="type.i18nKey" size="20"/>
这对除了Plot instaces 之外的每个元素都很有效。不是调用getType().getCode() 或getType().getI18nKey(),而是在Plot 的每个实例上调用普通toString()!经过几个小时有趣的调试,我注意到在标签评估期间Plot 的getParameters() 方法被调用了!所以似乎 struts 试图使用getParameters() 方法评估type.code 和type.i18nKey!如果不这样做,它会忽略我已明确指定使用的属性的存在!
将getParameters 重命名为getParamms 之类的奇怪名称后,问题就消失了。使用迭代器标签和属性标签而不是选择标签时也没有出现问题。
当我明确指定应该使用什么属性时,有没有人知道为什么 struts 选择标签使用我的 bean 的 parameters 属性?是一些“酷”的功能还是错误?
附:我使用struts 2.2.3.1
【问题讨论】:
标签: properties struts2 tags ognl