I campi di input contengono valori precedenti solo se la convalida non è riuscita

Ho avuto uno strano problema. Ho cercato di isolare il problema in modo seguente è il mio codice semplificato.

public class MyBean { private List dataList; Data selectedData; public MyBean() { dataList = new ArrayList(); dataList.add(new Data("John", 16)); dataList.add(new Data("William", 25)); } public List getDataList() { return dataList; } public void edit(Data data) { selectedData = data; } public void newData() { selectedData = new Data(null, null); } public Data getSelectedData() { return selectedData; } public class Data { String name; Integer age; Data(String name, Integer age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } } } 

xhtml:

   Name: 
Age :

#{data.name}

Questo è il percorso dell’errore:

  1. Carica la pagina
  2. Fai clic sul link “Modifica” nella prima riga (visualizza popup)
  3. In popup, deselezionare il campo “Età” e fare clic su “Salva”. (Messaggio richiesto visualizzato)
  4. Fai clic su Annulla (senza riempire il campo “Età”)
  5. Fai clic sul secondo link.
  6. Ora mostra dati irrilevanti (dati precedenti). – Questo è il problema
  7. Anche quando faccio clic sul pulsante “Nuovo” mostra dati errati.

Ciò accade solo se una convalida non è riuscita nel popup.
C’è una soluzione per questo?

Questo problema si trova in JSF 2 anche riconosciuto e spiegato in dettaglio nella seguente risposta: Come posso popolare un campo di testo utilizzando PrimeFaces AJAX dopo che si sono verificati errori di convalida? Se si stesse utilizzando JSF 2, si sarebbe potuto utilizzare ResetInputAjaxActionListener di ResetInputAjaxActionListener o PrimeFaces ‘ o resetValues="true" per questo.

Al punto, è necessario cancellare lo stato del componente EditableValueHolder quando sta per essere reso ajax, ma che non è incluso in ajax-execute. Per cancellare lo stato, in JSF 2 avresti usato il metodo di convenienza resetValue() per questo, ma questo non è disponibile in JSF 1.2 ed è necessario richiamare i 4 singoli metodi setValue(null) , setSubmittedValue(null) , setLocalValueSet(false) , setValid(true) per cancellare lo stato.

Per capire quali componenti devono essere resi ajax, ma non sono stati eseguiti ajax, in JSF 2 avresti usato i metodi PartialViewContext per questo, ma questo non è disponibile in JSF 1.2 che non ha ancora ajax standardizzato. Avresti bisogno di giocherellare con API API ajax specifiche di RichFaces per capirlo. Non posso dirlo dall’alto, quindi ecco un esempio di kickoff supponendo che tu già conosca i componenti che devono essere cancellati. Immagina che il modulo nel tuo popup abbia id="popForm" e che il campo di immissione del nome abbia id="nameInput" , ecco come puoi cancellarlo all’interno del metodo newData() :

 UIInput nameInput = (UIInput) context.getViewRoot().findComponent("popForm:nameInput"); nameInput.setValue(null); nameInput.setSubmittedValue(null); nameInput.setLocalValueSet(false); nameInput.setValid(true); 

fai una cosa su Annulla azione imposta tutti i valori di popup nulli. ora nel tuo prossimo clic tutti i valori sono impostati come predefiniti.

o al clic imposta tutti i valori precedenti null. e impostare successivamente tutti i rispettivi valori.

Ho avuto lo stesso problema. se stai usando Primefaces, la soluzione è semplice come mettere resetValues="true" sul tuo p: commandLink o p: commandButton che carica l’elemento selezionato.