SIGESA: Validaciones en Bean

Tipo 1: Validación tipo required

  • Para mostrar mensajes de error de tipo requiered (Cuadro rojo)
  • Vamos a hacer un ejemplo de la fecha final no puede ser anterior a la fecha inicial

objetivoOperativoAnualInstitucionalEditForm.xhtml

  • Asi queda fecha inicial
<!-- Fecha Inicial -->
                    <p:outputLabel id="fechaInicialOutputLabel"
                                   for="fechaInicialCalendar"
                                   value="#{i18n.objetivoPOAI_fechaInicial_label}" />
                    <p:outputPanel id="fechaInicialOutputPanel">
                        <p:calendar id="fechaInicialCalendar"
                                    value="#{objetivoPOAIBean.metaPOAI.fechaInicial}"
                                    required="#{not empty param[agregar.clientId]}"
                                    showOn="button"
                                    locale="es"
                                    pattern="dd/MM/yyyy"
                                    navigator="true"
                                    timeZone="America/Costa_Rica"
                                    mindate="#{objetivoPOAIBean.calendarioFechaInicio}"
                                    maxdate="#{objetivoPOAIBean.calendarioFechaFin}">
                            <p:ajax event="dateSelect"
                                    process="@this" 
                                    listener="#{objetivoPOAIBean.onFechaInicialSelect}"
                                    update="fechaFinalCalendar"/>
                        </p:calendar>
                    </p:outputPanel>
                    <p:message id="fechaInicialMessage"
                               for="fechaInicialCalendar" />
  • Aqui lo que destaca es que debemos hacer un metodo que cuando se seleccione una fecha incial limpie la fecha final
  • Y ademas que actualice el componente fecha final
<p:ajax event="dateSelect"
                                    process="@this" 
                                    listener="#{objetivoPOAIBean.onFechaInicialSelect}"
                                    update="fechaFinalCalendar"/>
  • El componente de fecha final queda así
<!-- Fecha Final -->
                    <p:outputLabel id="fechaFinalOutputLabel"
                                   for="fechaFinalCalendar"
                                   value="#{i18n.objetivoPOAI_fechaFinal_label}" />
                    <p:outputPanel id="fechaFinalOutputPanel">
                        <p:calendar id="fechaFinalCalendar"
                                    value="#{objetivoPOAIBean.metaPOAI.fechaFinal}"
                                    required="#{not empty param[agregar.clientId]}"
                                    showOn="button"
                                    locale="es"
                                    pattern="dd/MM/yyyy"
                                    navigator="true"
                                    timeZone="America/Costa_Rica"
                                    mindate="#{objetivoPOAIBean.calendarioFechaInicio}"
                                    maxdate="#{objetivoPOAIBean.calendarioFechaFin}"
                                    disabled="#{empty objetivoPOAIBean.metaPOAI.fechaInicial}"
                                    >
                            <p:ajax event="dateSelect"
                                    process="@this, @form" update="fechaFinalMessage" />
                            <f:validator binding="#{objetivoPOAIBean.fechaFinalValidator}" />
                        </p:calendar>
                    </p:outputPanel>
                    <p:message id="fechaFinalMessage"
                               for="fechaFinalCalendar" />
  • Aquí lo que destaca es que que cuando se seleccione una fecha actuilice el mensaje
  • Y ademas la creación de un validator binding
  • Y que este deshabilitado hasta que se seleccione una fecha inicio
disabled="#{empty objetivoPOAIBean.metaPOAI.fechaInicial}"

<p:ajax event="dateSelect"
                                    process="@this, @form" update="fechaFinalMessage" />

<f:validator binding="#{objetivoPOAIBean.fechaFinalValidator}" />

ObjetivoPOAIBean.java

  • Aquí agregamos los imports necesarios
import java.util.Date;
import javax.faces.application.FacesMessage;
import javax.faces.event.AjaxBehaviorEvent;
import javax.faces.validator.ValidatorException;
import javax.faces.validator.Validator;
import javax.faces.component.UIComponent;
  • Metodos
public Validator getFechaFinalValidator() {

        ObjetivoPOAIBean bean = this;
        
        return new Validator() {
            @Override
            public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
                Date fechaFinal = (Date) value;
                Date fechaInicial = bean.getMetaPOAI().getFechaInicial();

                if (fechaInicial != null && fechaFinal != null && fechaFinal.before(fechaInicial)) {
                    FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Fecha final no puede ser anterior a la fecha inicial", null);
                    throw new ValidatorException(msg);
                }
            }
        };
    }

    public void onFechaInicialSelect(AjaxBehaviorEvent event) {
        // Al Seleccionar una fecha Inicial limpiamos la fecha final
        this.getMetaPOAI().setFechaFinal(null);
    }