El atributo de vinculación hace que se encuentre una ID de componente duplicada en la vista

Aquí está el código JSF:

 

Y aquí hay una parte del bean de respaldo para soporte vinculante:

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

Cuando abro la página por primera vez todo funciona bien, pero cuando lo abro por segunda vez (actualizo o abro la misma URL en otra pestaña o de cualquier otra forma) recibo un error de ID duplicado. El mensaje de error dice que no tiene una ID única. Aquí hay una parte del mensaje de error largo:

 java.lang.IllegalArgumentException: Component ID formId:inputId has already been found in the view +id: inputId type: javax.faces.component.html.HtmlInputText@cafebabe 

El problema ocurrió después de que agregué el atributo de binding . Si lo elimino, todo volverá a funcionar bien. ¿Cómo uso correctamente el atributo de binding ?

Los errores de ID de componente duplicado pueden ocurrir cuando:

  • La misma ID se usa en diferentes componentes dentro del mismo NamingContainer .
  • Los componentes físicamente diferentes están ligados a la misma propiedad del mismo bean.
  • La se ha declarado en la página de inclusión en lugar de la página principal.
  • La misma página de inclusión se incluye varias veces dentro del mismo NamingContainer .
  • Un componente se crea dinámicamente sin tener una ID explícita asignada.

Aquí, NamingContainer es, entre otros, , y .

Al utilizar el binding , debe vincularlo a una propiedad que el componente en cuestión utiliza exclusivamente para cada solicitud. Su caso específico indica que este enlace ha sido compartido por varios componentes, tal vez a través de diferentes solicitudes. Cuando vincula el componente a una propiedad de un bean de respaldo, el bean de respaldo no debe estar en un ámbito más amplio que el scope de la solicitud. Consulte también el capítulo 3.1.5 de la especificación de JSF 2.0 (énfasis mío):

3.1.5 Enlaces de componentes

Los enlaces de componentes a menudo se usan junto con los JavaBeans que se instancian dinámicamente a través del recurso Managed Bean Creation (consulte la Sección 5.8.1 “VariableResolver y el VariableResolver predeterminado”). Se recomienda encarecidamente que los desarrolladores de aplicaciones coloquen beans administrados apuntados por expresiones de enlace de componentes en el ámbito de “solicitud”. Esto se debe a que colocarlo en sesión o en el scope de la aplicación requeriría seguridad de subprocesos, ya que las instancias de UIComponent dependen de la ejecución dentro de un único subproceso. También hay impactos potencialmente negativos en la administración de la memoria al colocar un enlace de componente en el ámbito de “sesión”.

Ver también:

  • ¿Cómo funciona el atributo ‘vinculante’ en JSF? ¿Cuándo y cómo se debe usar?
  • Cómo usar el enlace de componentes en JSF ¿verdad? (componente de ámbito de solicitud en bean con ámbito de sesión)
  • Ámbito de la vista: java.io.NotSerializableException: javax.faces.component.html.HtmlInputText

Tuve el mismo problema hasta que encontré esta etiqueta que evita el ID del componente duplicado