У меня есть базовый класс 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:
<s:select list="myElements" listKey="type.code" listValue="type.i18nKey" size="20"/>
Это сработалокак очарование для каждого элемента, за исключением Plot
instaces.Вместо вызова getType().getCode()
или getType().getI18nKey()
plain toString()
вызывался при каждом экземпляре Plot
!После нескольких часов веселой отладки я заметил, что во время оценки тега вызывается метод Plot
getParameters()
!Так что, похоже, Struts пытался оценить type.code
и type.i18nKey
, используя метод getParameters()
!В противном случае он игнорировал существование свойств, которые я четко указал для использования!
После переименования getParameters
в нечетное имя, такое как getParamms
, проблема исчезла.Кроме того, проблема не возникала при использовании тега итератора вместе с тегом свойства вместо тега select.
У кого-нибудь есть идея, ПОЧЕМУ структура Struts использует тег parameters
моего компонента, когда я четко указал, чтосвойство должно быть использовано?Это какая-то "крутая" функция или ошибка?
PS Я использую распорки 2.2.3.1