Отправка <h: selectManyListBox> вызывает "Ошибка проверки: значение недопустимо"
Приятели, я снова застрял во время своей веб-разработки, я предоставляю пользователю несколько списков выбора для выбора многих опций. Фрагмент страницы JSF
<h:selectManyListbox id="associatedAS" value="#{maintainForm.selectedAS}">
<s:selectItems value="#{maintainForm.associatedAS}" var="as" label="#{as.name}" />
<rmc:asConverter />
</h:selectManyListbox>
но проблема в том, что при отправке страницы я получаю сообщение об ошибке на консоли
sourceId= keepForm: relatedAS[серьезность =(ОШИБКА 2), сводка =(keepForm: relatedAS: Ошибка проверки: значение недопустимо), подробно =(keepForm: relatedAS: Ошибка проверки: значение недопустимо)]
Я не могу понять, почему это происходит, элемент, который я отображаю в списке, не является строкой, поэтому я написал преобразователь "asConverter" для преобразования значений из других объектов в строку и наоборот. Также значение, которое я дал выше в теге ' #{keepForm.selectedAS} ', относится к типу List (selectedAS).
Любая помощь приветствуется.
Спасибо.
2 ответа
У меня была та же проблема, что и у Рави Никама. Метод и конвертер Equals реализованы, и он отлично работает с selectOneMenu
, но это дает хороший Validation Error: Value is not valid
с selectManyListBox
, После нескольких часов поиска я нашел решение. selectManyListbox
основывается на javax.faces.component.UISelectMany
, Javadoc из UISelectMany
говорит:
Получить Конвертер, используя следующий алгоритм: Если к компоненту подключен конвертер, используйте его. Если нет, ищите ValueExpression для значения (если есть). Выражение ValueExpression должно указывать на то, что: * Массив примитивов (например, int[]). Посмотрите зарегистрированный конвертер класса для этого примитивного типа. * Массив объектов (например, Integer[] или String[]). Найдите зарегистрированный преобразователь по классам для базового типа элемента. * Java.util.Collection. Не конвертируйте значения.
Поэтому последний пункт в этом списке вызвал мою проблему: "Не конвертируйте значения".
Я указал в лицах-config.xml
<converter>
<converter-for-class>...
<converter-class>...
</converter>
в h:selectManyListbox
У меня не был указан конвертер.
Я решил проблему, добавив в Face-config.xml
<converter-id>myConv</converter-id>
и добавив атрибут converter="myConv"
к h:selectManyListbox
тег.
Эта проблема возникает при отправке некоторых значений на страницу, а затем некоторые или все отправленные исходные значения были изменены, или некоторые новые значения были добавлены на клиенте. Как вы уже знаете, то, что JSF сохраняет свое состояние просмотра на сервере или клиенте, зависит от того, как вы его настроили, поэтому он проверяет компонент, используя это состояние при отправке. В вашем случае выяснилось, что значения, отправленные клиенту, больше не совпадают. Следовательно, вы получите эту ошибку.
Если вы используете пользовательский конвертер, как я описал на странице конвертеров, вы должны предоставить метод равных для объекта, который вы пытаетесь преобразовать в и из. Если вы попытаетесь использовать метод equals по умолчанию или отклоните реализацию, объект не будет преобразован правильно, что приведет к довольно неинтуитивному сообщению об ошибке: "Ошибка проверки: значение недопустимо". - ссылка: crazysquirrel.com
Еще одно подобное предложение.