Сравните два поля, которые используют один и тот же класс - PullRequest
1 голос
/ 05 января 2012

У меня есть два поля ввода fromDate и toDate, которые являются экземплярами класса Date.Класс Date использует специальный валидатор Date, который проверяет поля месяца, дня и года, содержащиеся в поле даты.Пользовательский валидатор даты специфичен для каждой даты, т.е. fromDate и toDate.Мне нужно сравнить поля месяца, дня или года fromDate с toDate.Если значение fromDate больше, чем toDate, должно появиться сообщение проверки.

Обновление:

FromDate и toDate - это два пользовательских компонента даты, как показано ниже

<eg:dateField id="inpFromDate" value="#{mrBean.fromDate}" .... />
<eg:dateField id="inpToDate" value="#{mrBean.toDate}" .... />

fromDate и toDate являются экземплярами класса Date, который является

public class Date {
private String mm;
private String dd;
@customDateValidator   //Validates each date field
private String yyyy;
//constructors
//getters and setters

Как бы вы реализовали валидатор в этом случае, когда каждая дата уже имеет валидатор

1 Ответ

6 голосов
/ 05 января 2012

Да, вы можете!Предположим, у вас есть следующие поля ввода PrimeFaces:

<p:calendar id="from" value="#{mrBean.fromDate}" binding="#{from}" >
   <p:ajax process="from to" update="toDateMsg" />
</p:calendar>
<p:calendar id="to"   value="#{mrBean.toDate}" >
   <f:attribute name="fromDate" value="#{from.value}" />
   <f:validator validatorId="validator.dateRangeValidator" />
   <p:ajax process="from to" update="toDateMsg" />
</p:calendar>
<p:message for="to" id="toDateMsg" />

Это должно быть ваше Validator:

@FacesValidator("validator.dateRangeValidator")
public class DateRangeValidator implements Validator {

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        if (value == null || component.getAttributes().get("fromDate") == null) return;

        Date toDate   = (Date) value; 
        Date fromDate = (Date) component.getAttributes().get("fromDate");

        if (toDate.after(fromDate)) {
            FacesMessage message = new FacesMessage("Invalid dates submitted.");
            message.setSeverity(FacesMessage.SEVERITY_ERROR);
            throw new ValidatorException(message);
        }
    }
}

Обратите внимание, что я использую компонент <p:calendar> PrimeFaces для написания моего примера, потому чтосвойства, связанные с этим компонентом, будут автоматически преобразованы в объект Date перед проверкой.В вашей программе у вас может быть свой собственный Converter для преобразования String в Date.

...