«Ошибка проверки: значение недопустимо» из f: datetimeConverter - PullRequest
3 голосов
/ 23 марта 2011

Следующий код создает две радиокнопки.Каждый параметр содержит значение даты, которое успешно преобразуется в метку в формате «гггг-ММ-дд».Как только я сделаю выбор и нажму следующую кнопку, я получаю следующую ошибку «j_idt12: comDateChoice: Ошибка проверки: значение недопустимо».Это кажется достаточно простым, но что-то не так.Кто-нибудь из вас может это заметить?

Я использую JSF 2.0 в стеклянной рыбе.

Фасоль

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 Ответ

3 голосов
/ 23 марта 2011

Эта ошибка возникает, если выбранное значение элемента не прошло проверку 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" />

...