Validation 比较使用同一类的两个字段

Validation 比较使用同一类的两个字段,validation,jsf,jsf-2,Validation,Jsf,Jsf 2,我有两个输入字段fromDate和toDate,它们是Date类的实例。 Date类使用自定义日期验证器来验证月、日和年字段 包含在日期字段中。 自定义日期验证程序特定于每个日期,即fromDate和toDate。 我需要比较fromDate和toDate的月、日或年字段。 如果fromDate大于toDate,则必须显示验证消息 更新: fromDate和toDate是两个自定义日期组件,如下所示 <eg:dateField id="inpFromDate" value="#{mrBea

我有两个输入字段fromDate和toDate,它们是Date类的实例。 Date类使用自定义日期验证器来验证月、日和年字段 包含在日期字段中。 自定义日期验证程序特定于每个日期,即fromDate和toDate。 我需要比较fromDate和toDate的月、日或年字段。 如果fromDate大于toDate,则必须显示验证消息

更新:

fromDate和toDate是两个自定义日期组件,如下所示

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

在这种情况下,如果每个日期都有验证器,您将如何实现验证器?是的,您可以!假设您有以下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" />

请注意,我正在使用PrimeFaces的
组件编写示例,因为绑定到此组件的属性将在验证之前自动转换为
日期
对象。在您的程序中,您可以使用自己的
转换器
字符串
转换为
日期

是的,您可以!假设您有以下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" />

请注意,我正在使用PrimeFaces的
组件编写示例,因为绑定到此组件的属性将在验证之前自动转换为
日期
对象。在您的程序中,您可能有自己的
转换器
来将
字符串
转换为
日期

如果在设置结束日期后将开始日期更改为错误的日期会怎么样?当您使用普通的
时,这对OP更有帮助,但要点很清楚。顺便说一句,验证程序类名也可以比“DateValidator”更自我描述。可能是“DateRangeValidator”@BalusC我已经用
验证程序的新名称更新了我的答案。起初,我确实用
编写了我的示例。但是,我对
不是很熟悉,因为我一直在使用
。这就是为什么我最后用素面写作,并在结尾处写了一个便条:P@user1072193:hmm。。。我认为您可以将2个验证器组合成1个验证器,只用于
toDate
@Mr.J4mes:您的意思是删除@customDateValidator?如果在设置结束日期后将开始日期更改为错误日期会怎么样?如果您使用普通
会对OP更有帮助,但问题很清楚。顺便说一句,验证程序类名也可以比“DateValidator”更自我描述。可能是“DateRangeValidator”@BalusC我已经用
验证程序的新名称更新了我的答案。起初,我确实用
编写了我的示例。但是,我对
不是很熟悉,因为我一直在使用
。这就是为什么我最后用素面写作,并在结尾处写了一个便条:P@user1072193:hmm。。。我认为您可以将2个验证器组合成1个验证器,只用于
toDate
@Mr.J4mes:您的意思是删除@customDateValidator?
@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);
        }
    }
}