struts2:选择标签不喜欢带有“参数”的bean财产?
我有一个基类 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
子类,每个子类都引入了自己的属性。其中之一是 Plot:
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 select 标签:
<s:select list="myElements" listKey="type.code" listValue="type.i18nKey" size="20"/>
这对除 Plot< 之外的每个元素都起到了作用。 /code> 实例。在 < 的每个实例上调用普通的
toString()
,而不是调用 getType().getCode()
或 getType().getI18nKey()
代码>情节!经过几个小时的有趣调试后,我注意到在标记评估期间 Plot
的 getParameters()
方法被调用!所以看来struts正在尝试使用getParameters()
方法来评估type.code
和type.i18nKey
!如果不这样做,它就会忽略我已明确指定使用的属性的存在!
将 getParameters
重命名为一种奇怪的名称(例如 getParamms
)后,问题就消失了。当使用迭代器标签和属性标签而不是选择标签时,也没有出现这个问题。
当我明确指定应该使用什么属性时,有人知道为什么 struts select 标签使用我的 bean 的 parameters
属性吗?这是一些“很酷”的功能还是一个错误?
PS我使用struts 2.2.3.1
I have a base class ReportElement
which has type
property:
public abstract class ReportElement {
private ReportElementType type;
public ReportElementType getType() {
return type;
}
public void setType(ReportElementType type) {
this.type = type;
}
}
ReportElementType
is just an enum with specified code
and i18nKey
properties for each element. I have a couple of subclasses of ReportElement
, each of them introducing their own properties. One of them is Plot:
public class Plot extends ReportElement {
public Plot() {
setType(ReportElementType.PLOT);
}
private Collection<Parameter> parameters = new ArrayList<Parameter>();
public Collection<Parameter> getParameters() {
return parameters;
}
}
On some page I needed to display a collection of different ReportElement
instances, so I just used struts2 select tag:
<s:select list="myElements" listKey="type.code" listValue="type.i18nKey" size="20"/>
This worked like a charm for every element except for Plot
instaces. Instead of invoking getType().getCode()
or getType().getI18nKey()
plain toString()
was invoked on every instance of Plot
! After several hours of fun debugging I noticed that during tag evaluation Plot
's getParameters()
method is called! So it seems struts was trying to evaluate type.code
and type.i18nKey
using getParameters()
method! Failing to do that it ignored the existence of the properties, that I have clearly specified for usage!
After renaming getParameters
to a kind of odd name like getParamms
the problem gone. Also the problem hasn't occured when using iterator tag together with property tag instead of select tag.
Does anyone have an idea WHY struts select tag uses parameters
property of my bean, when I have clearly specified what property should be used? Is it some "cool" feature or a bug?
P.S. I use struts 2.2.3.1
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
所有 FreeMarker 模板中使用的表示标签参数的参数称为
parameters
。通过提供优先的parameters
属性,S2 无法访问堆栈上包含标签参数的对象。这既不是一个很酷的功能,也不是一个错误,这只是模板的实现方式。检查模板源可能会节省几个小时的调试时间。
The argument used in all the FreeMarker templates representing a tag's parameters is called
parameters
. By providing aparameters
property that takes precedence, S2 was unable to get to the object on the stack containing the tag's parameters.It's neither a cool feature nor a bug, it's just how the templates are implemented. Checking the template source may have saved the few hours of debugging.
在struts JIRA中找到相应的问题: https://issues.apache.org/jira/browse/ WW-3268
2.3 被指定为修复版本。
Found corresponding issue in struts JIRA: https://issues.apache.org/jira/browse/WW-3268
2.3 is specified as fix version.