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;
Другие вопросы по тегам