我有一个基类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
实例之外,这对于每个元素来说都是一种魅力。在getType().getCode()
的每个实例上调用了getType().getI18nKey()
或toString()
Plot
而不是Plot
。经过几个小时的有趣调试后,我注意到在标记评估过程中调用getParameters()
的{{1}}方法!所以struts似乎试图使用type.code
方法评估type.i18nKey
和getParameters()
!没有这样做,它忽略了属性的存在,我已明确指定使用!
将getParameters
重命名为getParamms
之类的奇怪名称后,问题就消失了。当使用迭代器标记和属性标记而不是选择标记时,也没有出现问题。
有没有人知道为什么struts select tag使用my bean的parameters
属性,当我明确指出应该使用什么属性时?它是一些“酷”功能还是一个错误?
P.S。我使用struts 2.2.3.1
答案 0 :(得分:2)
表示标签参数的所有FreeMarker模板中使用的参数称为parameters
。通过提供优先级parameters
的属性,S2无法访问包含标记参数的堆栈上的对象。
它既不是很酷的功能也不是bug,它只是模板的实现方式。检查模板源可能已经节省了几个小时的调试时间。
答案 1 :(得分:0)
在struts JIRA中找到了相应的问题:https://issues.apache.org/jira/browse/WW-3268
2.3被指定为修复版本。