struts2:select标签不喜欢具有“参数”属性的bean吗?

时间:2011-12-20 09:17:36

标签: properties struts2 tags ognl

我有一个基类ReportElement,其type属性:

public abstract class ReportElement {
    private ReportElementType type;

    public ReportElementType getType() {
        return type;
    }

    public void setType(ReportElementType type) {
        this.type = type;
    }
}

ReportElementType只是一个枚举,每个元素都有指定的codei18nKey属性。我有几个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.i18nKeygetParameters()!没有这样做,它忽略了属性的存在,我已明确指定使用!

getParameters重命名为getParamms之类的奇怪名称后,问题就消失了。当使用迭代器标记和属性标记而不是选择标记时,也没有出现问题。

有没有人知道为什么struts select tag使用my bean的parameters属性,当我明确指出应该使用什么属性时?它是一些“酷”功能还是一个错误?

P.S。我使用struts 2.2.3.1

2 个答案:

答案 0 :(得分:2)

表示标签参数的所有FreeMarker模板中使用的参数称为parameters。通过提供优先级parameters的属性,S2无法访问包含标记参数的堆栈上的对象。

它既不是很酷的功能也不是bug,它只是模板的实现方式。检查模板源可能已经节省了几个小时的调试时间。

答案 1 :(得分:0)

在struts JIRA中找到了相应的问题:https://issues.apache.org/jira/browse/WW-3268

2.3被指定为修复版本。