L’attributo di associazione causa l’ID di componente duplicato trovato nella vista

Ecco il codice JSF:

 

Ed ecco una parte del backing bean per il supporto vincolante:

 private HtmlInputText input; public void setInput(HtmlInputText input) { this.input = input; } public HtmlInputText getInput() { return this.input; } 

Quando apro la pagina alla prima volta, tutto funziona correttamente ma quando lo apro alla seconda volta (aggiorna o apri lo stesso url in un’altra scheda o in un altro modo) ottengo un errore dell’ID duplicato. Il messaggio di errore dice che non ha ID univoco. Ecco una parte del messaggio di errore lungo:

 java.lang.IllegalArgumentException: Component ID formId:inputId has already been found in the view +id: inputId type: [email protected] 

Il problema si è verificato dopo aver aggiunto binding attributo di binding . Se lo rimuovo, tutto funzionerà di nuovo bene. Come utilizzo correttamente binding attributo di binding ?

Gli errori dell’ID componente duplicato possono verificarsi quando:

  • Lo stesso ID viene utilizzato su diversi componenti all’interno dello stesso NamingContainer .
  • Componenti fisicamente diversi sono legati alla stessa proprietà dello stesso bean.
  • è stato dichiarato nella pagina di inclusione anziché nella pagina padre.
  • La stessa pagina include è inclusa più volte all’interno dello stesso NamingContainer .
  • Un componente è stato creato dynamicmente senza che sia stato assegnato un ID esplicito.

Qui, NamingContainer è tra gli altri , e .

Quando si utilizza l’ binding , è necessario associarla a una proprietà che viene utilizzata esclusivamente dal componente in questione in base alle richieste. Il tuo caso specifico indica che questa associazione è stata condivisa da più componenti, forse tra diverse richieste. Quando si associa il componente a una proprietà di un bean di supporto, il bean di backing non deve assolutamente trovarsi in un ambito più ampio dell’ambito della richiesta. Vedi anche il capitolo 3.1.5 della speculazione JSF 2.0 (enfasi mia):

3.1.5 Collegamenti dei componenti

I collegamenti dei componenti vengono spesso utilizzati in congiunzione con JavaBeans che vengono creati in modo dinamico tramite la funzione di creazione dei bean gestiti (vedere la Sezione 5.8.1 “VariableResolver e Default VariableResolver”). Si consiglia vivamente agli sviluppatori di applicazioni di posizionare bean gestiti indicati dalle espressioni di collegamento dei componenti in ambito “richiesta”. Questo perché posizionarlo in ambito di sessione o applicazione richiederebbe la sicurezza del thread, poiché le istanze di UIComponent dipendono dall’esecuzione all’interno di un singolo thread. Vi sono anche impatti potenzialmente negativi sulla gestione della memoria quando si posiziona un bind del componente in ambito “sessione”.

Guarda anche:

  • Come funziona l’attributo ‘binding’ in JSF? Quando e come dovrebbe essere usato?
  • Come usare il binding di componenti in JSF giusto? (componente con ambito di richiesta nel bean con ambito di sessione)
  • Visualizza ambito: java.io.NotSerializableException: javax.faces.component.html.HtmlInputText

Ho avuto lo stesso problema fino a quando ho trovato questo tag che evitava l’id del componente duplicato