Эта ошибка возникает, если выбранное значение элемента не прошло проверку Object#equals()
ни на одном из доступных значений элемента выбора. Это может произойти, если получатель вернул другой список на этапе применения значений запроса в форме отправки запроса, чем это было во время первоначального запроса на отображение формы.
Поскольку вы восстанавливаете список в методе получения вместо того, чтобы создавать его один раз в конструкторе 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" />