Ответ 1
Сбой проверки с сообщением "form: location: Ошибка проверки: значение недействительно"
Эта ошибка сводится к тому, что выбранный элемент не соответствует ни одному из доступных значений элемента выбора, указанному любым вложенным тегом <f:selectItem(s)>
во время обработки запроса на отправку формы.
Как часть защиты от несанкционированных/взломанных запросов, JSF будет повторять все доступные значения элементов выбора и проверять, если selectedItem.equals(availableItem)
возвращает true
для хотя бы одного доступного значения элемента. Если значение одного элемента не совпадает, вы получите именно эту ошибку проверки.
Этот процесс находится под обложками в основном так, как показано ниже, в соответствии с чем bean.getAvailableItems()
представляет собой полный список доступных элементов выбора, определенных в <f:selectItem(s)>
:
String submittedValue = request.getParameter(component.getClientId());
Converter converter = component.getConverter();
Object selectedItem = (converter != null) ? converter.getAsObject(context, component, submittedValue) : submittedValue;
boolean valid = false;
for (Object availableItem : bean.getAvailableItems()) {
if (selectedItem.equals(availableItem)) {
valid = true;
break;
}
}
if (!valid) {
throw new ValidatorException("Validation Error: Value is not valid");
}
Таким образом, на основе вышеуказанной логики эта проблема может логически иметь по крайней мере следующие причины:
- Выбранный элемент отсутствует в списке доступных элементов.
- Метод
equals()
класса, представляющего выделенный элемент, отсутствует или сломан. - Если используется пользовательский
Converter
, он возвращает неверный объект вgetAsObject()
. Возможно, это дажеnull
.
Чтобы решить эту проблему:
- Убедитесь, что точно такой же список сохранен во время последующего запроса, особенно в случае нескольких каскадных меню. Создание bean
@ViewScoped
вместо@RequestScoped
должно исправлять его в большинстве случаев. Также убедитесь, что вы не выполняете бизнес-логику в методе getter<f:selectItem(s)>
, а вместо этого в@PostConstruct
или методе события (слушателя). Если вы полагаетесь на конкретные параметры запроса, вам нужно будет явно хранить их в@ViewScoped
bean или повторно передать их при последующих запросах, например.<f:param>
. См. Также Как правильно выбрать область bean? - Убедитесь, что метод
equals()
реализован правильно. Это уже сделано на стандартных Java-типах, таких какjava.lang.String
,java.lang.Number
и т.д., Но не обязательно на пользовательских объектах /beans/entites. См. Также Правильный способ выполнения равного контракта. Если вы уже используетеString
, убедитесь, что кодировка символов запроса настроена правильно. Если он содержит специальные символы, а JSF сконфигурирован для визуализации вывода как UTF-8, но интерпретирует входные данные, например. ISO-8859-1, то он потерпит неудачу. См. Также a.o. Вход Unicode, полученный через входные компоненты PrimeFaces, поврежден. - Отлаживайте/регистрируйте действия своего пользовательского
Converter
и исправляйте его соответствующим образом. Для получения рекомендаций см. Также Значение параметра ошибки конверсии для 'null Converter' Если вы используетеjava.util.Date
в качестве доступных элементов с<f:convertDateTime>
, убедитесь, что вы Не забудьте полную часть времени в шаблоне. См. Также "Ошибка проверки: значение недействительно" ошибка от f: datetimeConverter.
См. также:
- Наша страница
selectOneMenu
wiki - Как заполнить параметры h: selectOneMenu из базы данных?
- Сделать несколько зависимых/каскадных selectOneMenu списков в JSF
Если кто-то может бросить некоторые советы по устранению неполадок/отладки для этой проблемы, мы будем очень благодарны.
Просто задайте здесь ясный и конкретный вопрос. Не задавайте слишком широких вопросов;)