"Ошибка проверки: значение недопустимо" от f:datetimeConverter
Следующий код создает две радиокнопки. Каждый параметр содержит значение даты, которое успешно преобразуется в метку в формате "гггг-ММ-дд". Как только я сделаю выбор и нажму следующую кнопку, я получаю следующую ошибку "j_idt12:comDateChoice: Ошибка проверки: значение недопустимо". Это кажется достаточно простым, но что-то не так. Кто-нибудь из вас может это заметить?
Я использую JSF 2.0 в Glassfish.
Боб
public List<SelectItem> getComDateList() {
List<SelectItem> items = new ArrayList<SelectItem>();
Calendar cal = GregorianCalendar.getInstance();
cal.set(Calendar.DAY_OF_MONTH, 1);
cal.add(Calendar.MONTH, 1);
Date nextFirst = cal.getTime();
cal.add(Calendar.MONTH, 1);
Date followingFirst = cal.getTime();
items.add(new SelectItem(nextFirst, new SimpleDateFormat("yyyy-MM-dd").format(nextFirst)));
items.add(new SelectItem(followingFirst, new SimpleDateFormat("yyyy-MM-dd").format(followingFirst)));
return items;
}
Код JSF
<h:panelGrid columns="2">
<h:outputLabel value="#{msg.FinanceCommencementDate}" for="comDateChoice"/>
<h:selectOneRadio id="comDateChoice" value="#{signUpBean.current.commencementDate}" layout="pageDirection">
<f:convertDateTime type="date" dateStyle="short"/>
<f:selectItems value="#{signUpBean.comDateList}"/>
</h:selectOneRadio>
</h:panelGrid>
1 ответ
Эта ошибка произойдет, если значение выбранного элемента не прошло Object#equals()
проверьте любое из доступных значений элемента select. Это может произойти, если получатель возвратил другой список на этапе применения значений запроса в форме отправки запроса, чем во время первоначального запроса на отображение формы.
Поскольку вы восстанавливаете список в получателе, а не один раз в конструкторе bean-объекта с областью видимости, Date
объекты будут получать разную временную метку при каждом вызове, в будущем это будет несколько минут / секунд по сравнению с первоначальным Date
объекты. Следовательно equals()
не удастся.
Переместите эту логику в конструктор bean-компонента и перепишите геттер так, чтобы он делал то, что должен: возвращать только данные. Не делайте загрузку логики в геттере. Вы также должны поместить компонент в область просмотра, чтобы конструктор не запускался повторно при отправке формы.
@ManagedBean
@ViewScoped
public class SignUpBean {
private List<SelectItem> comDateList;
public SignUpBean() {
comDateList = new ArrayList<SelectItem>();
// Fill it here.
}
public List<SelectItem> getComDateList() {
return comDateList; // In getters, do nothing else than returning data!
}
}
Обновление: конвертер также является потенциальным источником проблемы. Вы в основном проинструктировали его об отсутствии времени при отображении HTML-страницы. Таким образом, он использует время по умолчанию при преобразовании обратно в Date
, Либо использовать
<f:convertDateTime pattern="yyyy-MM-dd HH:mm:ss.SSS Z" />
или сбросьте время и часовой пояс на Calendar
заранее:
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
cal.setTimeZone(TimeZone.getTimeZone("GMT"));
Таким образом, вы можете использовать только <f:convertDateTime type="date" />