Domanda

Il seguente codice crea due pulsanti di radio. Ogni opzione contiene un valore di data che viene convertito correttamente in un'etichetta del formato "YYYY-MM-DD". Una volta effettuato una selezione e faccio clic sul pulsante successivo, ottengo il seguente errore "J_IDT12: COMDATECHOICE: ERRORE VALIDAZIONE: Il valore non è valido". Sembra abbastanza semplice ma qualcosa di sbagliato. Qualcuno di voi può individuarlo?

Sto usando JSF 2.0 in Glassfish.

Fagiolo di supporto

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

Codice 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>
È stato utile?

Soluzione

Questo errore si verificherà se il valore dell'elemento selezionato non è passato Object#equals() Verificare su uno qualsiasi dei valori di selezione degli elementi disponibili. Ciò può accadere se Gettter ha restituito un elenco diverso durante la fase dei valori della richiesta applicabile della richiesta di invio del modulo rispetto alla richiesta iniziale di visualizzare il modulo.

Perché stai ricostruendo l'elenco in getter invece di costruire una volta nel costruttore di una vista con fagioli con scoppi, il Date Gli oggetti riceveranno un timestamp diverso su ogni chiamata, saranno alcuni minuti/secondi in futuro rispetto alla iniziale Date oggetti. Quindi il equals() avrà esito negativo.

Sposta questa logica nel costruttore del fagiolo e riscrivi il getter in modo che faccia quello che dovrebbe fare: restituire solo i dati. Non eseguire la logica di caricamento in un getter. Dovresti anche mettere il fagiolo nell'ambito di visualizzazione in modo che il costruttore non riesca a rieseguire quando si invia il modulo.

@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!
    }

}

Aggiornare: Il convertitore è anche una potenziale fonte del problema. Fondamentalmente l'hai incaricato di rimuovere il tempo quando si rende la pagina HTML. Quindi usa il tempo predefinito quando si converte a Date. O usare

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

o reimpostare il fuso orario e il tempo su Calendar in anticipo:

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"));

In questo modo puoi usare solo un <f:convertDateTime type="date" />

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top