比较使用相同类的两个字段

时间:2012-01-05 16:11:15

标签: validation jsf jsf-2

我有两个输入字段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 个答案:

答案 0 :(得分:6)

是的,你可以!假设您有以下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);
        }
    }
}

请注意,我使用PrimeFaces的<p:calendar>组件来编写我的示例,因为绑定到此组件的属性将在验证之前自动转换为Date对象。在您的计划中,您可能拥有自己的Converter转换StringDate