Богатый Календарь Валидатор - PullRequest
1 голос
/ 13 марта 2012

Я новичок в JSF, и я уверен, что делаю что-то глупое, но я пробовал разные вещи в течение нескольких дней и не могу добиться никакого прогресса. Я пытаюсь выполнить проверку, когда пользователь вводит дату вместо использования расширенного календаря, но по какой-то причине я не могу запустить валидатор. Код страницы выглядит следующим образом:

<a4j:outputPanel id="responseReleaseDate" rendered="#{appealSearchManager.isVendor}">
    <p><h:outputText value="#{messages.ResponseReleaseDate}"/></p>
    <rich:calendar id="responseReleaseDateBegin" datePattern="MM/dd/yyyy"
        enableManualInput="true"
        buttonIcon="/images/calendar_icon.jpg" buttonClass="calendar"
        validator="#{appealSearchManager.validateResponseReleaseDateBegin}"
        value="#{appealSearchManager.responseReleaseDateBegin}">
    </rich:calendar>
    <rich:calendar id="responseReleaseDateEnd" datePattern="MM/dd/yyyy"
        enableManualInput="true"
        buttonIcon="/images/calendar_icon.jpg" buttonClass="calendar"
        validator="#{appealSearchManager.validateResponseReleaseDateBegin}"
    value="#{appealSearchManager.responseReleaseDateEnd}">
    </rich:calendar>
</a4j:outputPanel>

Код компонента, который я пытаюсь вызвать, выглядит следующим образом:

    public void validateResponseReleaseDateBegin(FacesContext facesContext, UIComponent uiComponent, Object value) throws ValidatorException {
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MM/dd/yyyy");
    if (value != null && !value.equals("")) {
        try {
            simpleDateFormat.parse(value.toString());
        } catch (ParseException e) {
            throw new ValidatorException(new FacesMessage(
                FacesMessage.SEVERITY_ERROR,
                MessageFormat.format((RootUtils.getCommonBundle().getString(BundleConstants.INVALID_ITEM)), "Response Release Date"),
                MessageFormat.format(RootUtils.getCommonBundle().getString(BundleConstants.INVALID_DATE_FORMAT), "Date", "MM/DD/YYYY")));

        }
    }
}

Самое странное, что я могу получить доступ к методу validateResponseReleaseDateBegin (...) с помощью приведенного ниже кода (я знаю, это не имеет смысла для текстового поля, это было только для целей тестирования). Но я никогда не использую этот метод при вводе данных для расширенного календаря.

<div class="div30">
    <p><h:outputText value="#{messages.ProgramInvoiceId}"/></p>
    <h:inputText id="programInvoiceId"
        validator="#{appealSearchManager.validateResponseReleaseDateBegin}"
        value="#{appealSearchManager.programInvoiceId}"/>
</div>

Есть идеи, почему этот валидатор работает в одном месте, а не в другом?

Спасибо!

1 Ответ

4 голосов
/ 13 марта 2012

Это не имеет смысла. <rich:calendar> уже неявно преобразует представленное значение String в Date перед установкой его в качестве значения модели. Если вы введете дату в неверном формате, <rich:calendar> уже сгенерирует ConverterException для этого. Его сообщение уже должно быть видно в любом компоненте <h:messages> или <h:message>, связанном с компонентом.

Поскольку преобразование выполняется до проверки , ваш валидатор никогда не запускается, если преобразование завершается неудачно. Даже когда ваш валидатор был запущен, аргумент Object value в валидаторе уже типа java.util.Date. Таким образом, если ваш валидатор был запущен, он всегда вызвал бы исключение, потому что Date#toString() определенно не соответствует MM/dd/yyyy.

Я не уверен, зачем вам нужен этот валидатор. Возможно, вы просто хотели предоставить пользовательское сообщение об ошибке преобразования? В этом случае вы должны использовать вместо него атрибут converterMessage.

<rich:calendar ... converterMessage="Invalid date" />

Или, если вам действительно нужно «проверить» формат даты самостоятельно, вместо этого реализуйте пользовательский Converter и зарегистрируйте его по атрибуту converter или тегу <f:converter>.

...