Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Issue with <f: validator> and ajax in JSF

I want to validate two dates in a form before the user do the action. So I got a f:validator inside a p:calendar working with ajax, the problem is with the f:attribute. I am passing the start date as a parameter and the validator do not receive this date. However if press the action button, the date parameter is there in validation. I am using this post as a guide. My xhtml is:

    <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>

And Validator:

@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);
    }
}

Appreciate any help with that.

like image 485
Jorge Iten Jr Avatar asked Nov 13 '22 11:11

Jorge Iten Jr


1 Answers

There are a couple of problems that I see here:

execute="@Form"

The above is incorrect. If you wish to execute the whole form the correct value here is @form.

Once correcting this the txtStartDate component should update its binding value and can be set as the attribute for txtEndDate.

like image 75
maple_shaft Avatar answered Nov 15 '22 06:11

maple_shaft