h:selectOneMenu связан с ошибками типа int "Ошибка проверки: значение недопустимо"
Я застрял с JSF RI 1.1_02 и вижу эту проблему.
Вот код Facelet, который я ожидаю работать:
<h:form>
<h:selectOneMenu value="#{bean.num}" converter="javax.faces.Integer">
<f:selectItem itemLabel="one" itemValue="1" />
<f:selectItem itemLabel="two" itemValue="2" />
<f:selectItem itemLabel="three" itemValue="3" />
</h:selectOneMenu>
<h:commandButton value="submit" />
<h:messages />
</h:form>
Боб области действия запроса:
public class Bean {
private int num;
public void setNum(Integer aNum) {
num = aNum;
}
public Integer getNum() {
return num;
}
}
Я получаю сообщение об ошибке проверки: значение недопустимо и я не могу себе представить, что я делаю неправильно, когда я написал так мало кода, который не должен нуждаться в конвертере. Я что-то упускаю из виду или это ошибка в JSF RI 1.1_02?
Я могу обойти эту проблему, просто изменив тип свойства в компоненте поддержки на String
но я просто разочарован необходимостью сделать это, когда (автоматическое) преобразование должно быть там для меня.
1 ответ
Я потратил время на создание игровой среды JSF RI 1.1_02 и смог воспроизвести вашу проблему. После проверки исходного кода виновник кажется, что <f:selectItem>
значение никогда не преобразуется в тот же тип, что и переданное значение. Таким образом, в основном это сравнение стоимости элемента как String
против представленной стоимости как Integer
и это сравнение никогда не вернется true
,
Это довольно неловкая ошибка, которая технически может быть решена только путем замены UISelectOne
компонент (UISelectMany
кстати выставляет такую же ошибку). Проблема в частном matchValue()
метод. Пользовательский конвертер (решение, которое я изначально имел в виду) не поможет, так как он не будет вызываться для <f:selectItem>
значение на всех.
Обновление до Моджарры 1.2_15 мгновенно решило проблему.
Обновление: если вы действительно не можете обновить, я нашел обходной путь, использующий принудительное использование EL: если вы ссылаетесь на значения в EL вместо статических строк, то они неявно рассматриваются как Long
, Если вы измените тип свойства с Integer
в Long
тогда он будет работать без какого-либо конвертера.
<h:selectOneMenu value="#{bean.num}">
<f:selectItem itemLabel="one" itemValue="#{1}" />
<f:selectItem itemLabel="two" itemValue="#{2}" />
<f:selectItem itemLabel="three" itemValue="#{3}" />
</h:selectOneMenu>
с
private Long num;