JSF中的<f:validator>和ajax问题

Jor*_* Jr 5 java jsf primefaces

我想在用户执行操作之前验证表单中的两个日期。所以我在使用ajax的ap:calendar中获得af:validator,问题出在f:attribute。我将开始日期作为参数传递,验证器未收到该日期。但是,如果按操作按钮,则日期参数在验证中。我以这篇文章为指导。我的xhtml是:

    <p:column >
                        <p:calendar  id="txtStartDate" binding="#{txtStartDate}"
                            pattern="dd/MM/yyyy"
                            value="#{myBean.bean.startDate}">                               
                        </p:calendar>
                    </p:column>
                    <p:column>
                        <p:calendar id="txtEndDate"
                            pattern="dd/MM/yyyy"
                            value="#{myBean.bean.endDate}">
                            <f:validator validatorId="validator.dateRangeValidator" />
                            <f:attribute name="fromDate" value="#{txtStartDate.value}" />                                
                            <p:ajax event="dateSelect" execute="@Form" update=":formHeader:messages" />
                        </p:calendar>
                    </p:column>
Run Code Online (Sandbox Code Playgroud)

和验证器:

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

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

    if (!endDate.after(startDate)) {
        FacesMessage message = new FacesMessage("End date before the start date.");
        message.setSeverity(FacesMessage.SEVERITY_ERROR);
        addMessageOnSession(FacesMessage.SEVERITY_ERROR, "Invalid dates");
        throw new ValidatorException(message);
    }
}
Run Code Online (Sandbox Code Playgroud)

感谢任何帮助。

Jor*_* Jr 0

不管怎样,对我来说一个快速的解决方案是在ajax标签中添加一个listener =“”,所以我在bean上进行验证。我不知道这是否是最好的方法,但解决我的问题。