Pregunta

El siguiente código crea dos botones de radio. Cada opción contiene un valor de fecha que se convierte correctamente en una etiqueta del formato "A yyyy-MM-DD". Una vez que hago una selección y haga clic en el botón siguiente, obtengo el siguiente error "J_idt12: ComdateChoice: Error de validación: el valor no es válido". Parece bastante simple, pero algo está mal. ¿Puede alguno de ustedes detectarlo?

Estoy usando JSF 2.0 en peces de vidrio.

Frijol de respaldo

public List<SelectItem> getComDateList() {
    List<SelectItem> items = new ArrayList<SelectItem>();
    Calendar cal = GregorianCalendar.getInstance();
    cal.set(Calendar.DAY_OF_MONTH, 1);
    cal.add(Calendar.MONTH, 1);
    Date nextFirst = cal.getTime();
    cal.add(Calendar.MONTH, 1);
    Date followingFirst = cal.getTime();
    items.add(new SelectItem(nextFirst, new SimpleDateFormat("yyyy-MM-dd").format(nextFirst)));
    items.add(new SelectItem(followingFirst, new SimpleDateFormat("yyyy-MM-dd").format(followingFirst)));
    return items;
}

Código JSF

<h:panelGrid columns="2">
                    <h:outputLabel value="#{msg.FinanceCommencementDate}" for="comDateChoice"/>
                    <h:selectOneRadio id="comDateChoice" value="#{signUpBean.current.commencementDate}" layout="pageDirection">
                        <f:convertDateTime type="date" dateStyle="short"/>
                        <f:selectItems  value="#{signUpBean.comDateList}"/>
                    </h:selectOneRadio>
                </h:panelGrid>
¿Fue útil?

Solución

Este error ocurrirá si el valor del elemento seleccionado no pasó el Object#equals() Verifique cualquiera de los valores de elemento seleccionados disponibles. Esto puede suceder si el Getter devolvió una lista diferente durante la fase de valores de solicitud de aplicación de la solicitud de envío del formulario que durante la solicitud inicial para mostrar el formulario.

Porque estás reconstruyendo la lista en el Getter en lugar de construir una vez en el constructor de un frijol alcanzado, el Date Los objetos obtendrán una marca de tiempo diferente en cada llamada, serán algunos minutos/segundos en el futuro en comparación con la inicial Date objetos. Por lo tanto, la equals() fallará.

Mueva esta lógica al constructor del frijol y reescribe el Getter para que haga lo que se supone que debe hacer: devolver solo los datos. No hagas la lógica de carga en un Getter. También debe poner el frijol en el alcance de la vista para que el constructor no vuelva a ejecutar cuando envía el formulario.

@ManagedBean
@ViewScoped
public class SignUpBean {

    private List<SelectItem> comDateList;

    public SignUpBean() {
        comDateList = new ArrayList<SelectItem>();
        // Fill it here.
    }

    public List<SelectItem> getComDateList() {
        return comDateList; // In getters, do nothing else than returning data!
    }

}

Actualizar: El convertidor también es una fuente potencial del problema. Básicamente, lo has instruido para quitar el tiempo al renderizar la página HTML. Entonces usa el tiempo predeterminado al convertir de nuevo a Date. Ya sea

<f:convertDateTime pattern="yyyy-MM-dd HH:mm:ss.SSS Z" />

o restablecer la hora y la zona horaria en el Calendar antemano:

cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
cal.setTimeZone(TimeZone.getTimeZone("GMT"));

De esta manera puedes usar solo un <f:convertDateTime type="date" />

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top