"Ошибка проверки: значение недопустимо" от 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" />

Другие вопросы по тегам