rich: скрытая проверка календаря / перезаписывает / ??ошибки проверки моего бина - PullRequest
0 голосов
/ 13 марта 2012

Мое приложение использует rich: calendars и h: inputText. Если я помещаю неверные данные ввода в пользовательский интерфейс для intputText (то есть нечисловые данные) и нажимаю «Поиск», я получаю правильное сообщение об ошибке от компонента. Однако, если я добавлю недопустимые данные как в inputText (не числовой), так и в rich: calendar (ввод, не связанный с датой, например, «foo»), я получу только сообщения об ошибках rich: calendar. Это похоже на то, что сообщения проверки собственного расширенного календаря выбивают сообщения проверки компонентов.

Как получить все сообщения для отображения?

Код xhtml выглядит следующим образом:

    <html xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets" xmlns="http://www.w3.org/1999/xhtml"
      xmlns:a4j="http://richfaces.org/a4j"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:tr="http://myfaces.apache.org/trinidad"
      xmlns:rich="http://richfaces.org/rich">
<f:view>
    <br/>
    <div class="container">
    <tr:form id="searchCriteria" defaultCommand="appealSearchManager.search">
        <a4j:outputPanel id="errorMessagesPanel">
            <h:messages id="errorMessages"/>
        </a4j:outputPanel>
        <div class="div30">
            <p><h:outputText value="#{messages.ProgramInvoiceId}"/></p>
            <h:inputText id="programInvoiceId" value="#{appealSearchManager.programInvoiceId}"/>
        </div>
        <div class="div30">
        <p><h:outputText value="#{messages.ResponseReleaseDate}"/></p>
        <rich:calendar id="responseReleaseDateBegin"
            enableManualInput="true"  datePattern="MM/dd/yyyy"
            buttonIcon="/images/calendar_icon.jpg" buttonClass="calendar"
            converterMessage="Invalid Response Release begin date.  Format must be blah, blah, blah."
            value="#{appealSearchManager.responseReleaseDateBegin}">
        </rich:calendar>
        <rich:calendar id="responseReleaseDateEnd"
            enableManualInput="true"  datePattern="MM/dd/yyyy"
            buttonIcon="/images/calendar_icon.jpg" buttonClass="calendar"
           converterMessage="Invalid Response Release End date.  Format must be blah, blah, blah."
            value="#{appealSearchManager.responseReleaseDateEnd}">
        </rich:calendar>
        </div>

        <div class="searchaction">
            <div>
                <ul>

                    <li>
                        <a4j:commandLink id="searchButton"
                                         value="#{messages.Search}"
                                         actionListener="#{appealSearchManager.search}"
                                         reRender="errorMessagesPanel, richErrorMessages, errorMessages"
                                         styleClass="searchbtn"/>
                    </li>
                </ul>
            </div>
        </div>
    </tr:form>
    </div>
</f:view>
</html>

и код бина:

    public void search(ActionEvent e) {
    setHasErrors(validateCriteria());
}

private boolean validateCriteria() {
    boolean isValid = true;
    //always check for Program Invoice ID may contain a comma-separated list of ids
    if (getProgramInvoiceId() != null && !getProgramInvoiceId().equals("") && !areValidProgamInvoiceIds(getProgramInvoiceId())) {
        String errorMessage = "Invalid Program Invoice ID.  Must be comma delimited list of numbers.";
        FacesContext.getCurrentInstance().addMessage(null,
                                                     new FacesMessage(FacesMessage.SEVERITY_ERROR, errorMessage, errorMessage));
        isValid = false;
    }
    //check Dates Response Release Date
    if (!isValidDateRange("Response Release Date", getResponseReleaseDateBegin(), getResponseReleaseDateEnd())) {
        isValid = false;
    }
    return isValid;
}

private boolean areValidProgamInvoiceIds(String ids) {
    boolean validIds = true;
    String regexp = "^([0-9]+(-[0-9]+)*,*)+$";
    Pattern pattern = Pattern.compile(regexp);
    if (!pattern.matcher(ids).matches()) {
        validIds = false;
    }
    return validIds;
}

private boolean isValidDateRange(String dateRange, Date startDate, Date endDate) {
    boolean isValidDateAndRange = true;
    Calendar futureDate = Calendar.getInstance();
    futureDate.roll(Calendar.DAY_OF_MONTH, 2);
    if ((startDate != null && (endDate == null || endDate.equals(""))) ||
         ((startDate == null || startDate.equals("")) && endDate != null)) {
        //one date is null and the other has a value.  We need both values to do a search.
        String errorMessage = "Invalid " + dateRange + " range.  Missing Date. A date range must contain both start and end dates.";
        FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, errorMessage, errorMessage));
    } else if (startDate != null && endDate != null) {
        if (isValidDateAndRange) {
            //future start dates are not allowed
            if (startDate.after(futureDate.getTime())) {
                String errorMessage = "Invalid date range.  Start date must be less than today's date.";
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, errorMessage, errorMessage));
                isValidDateAndRange = false;
            }
            //start date greater than the end date is not allowed
            if (endDate.before(startDate)) {
                String errorMessage = "Invalid date range.  End date must be greater than or equal to start date.";
                FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, errorMessage, errorMessage));
                isValidDateAndRange = false;
            }
        }
    }
    return isValidDateAndRange;
}

Любые предложения будут с благодарностью. Спасибо!

1 Ответ

0 голосов
/ 14 марта 2012

Вы не должны выполнять проверку внутри метода действия.Вы должны выполнить это, используя обычный Validator, который вы связываете <f:validator> или любым из стандартных тегов <f:validateXxx>.Метод действия никогда не вызывается при сбое проверки.

Например, для проверки идентификатора счета программы используйте <f:validateRegex>.

<h:inputText id="programInvoiceId" value="#{appealSearchManager.programInvoiceId}" validatorMessage="Invalid Program Invoice ID.  Must be comma delimited list of numbers.">
    <f:validateRegex pattern="^([0-9]+(-[0-9]+)*,*)+$" />
</h:inputText>

Проверка диапазона дат немного сложнее.Кстати, вам нужно поместить класс Validator как <f:validator> в один из компонентов и передать значение другого компонента в качестве атрибута.Для примера см. Также Сравните два поля, которые используют один и тот же класс .

Кстати, будьте осторожны с терминологией, вы не , используя "beanvalidation " вообще, но вы просто вручную проверяете в методе действия.

...