2010-08-10 24 views
7

Tengo un problema con los identificadores duplicados en mi aplicación JSF. He leído in this post que una de las posibles soluciones es usar el contenedor de nombres. ¿Me puede dar algún ejemplo de cómo usar el contenedor de nombres para evitar el problema de los identificadores duplicados? Yo uso Facelets.Jsf Cómo crear un contenedor de nombres

Respuesta

12

Esto es lo que funcionó para mí usando JSF1.2 y facelets:

he descubierto que ni <ui:composition> ni <ui:component> es en realidad un contenedor de nombres, así que usar el mismo componente más de una vez en la misma forma fallaría con una excepción de identificación duplicada Esto parece un mal diseño, ya que el objetivo de los componentes es la reutilización. Para solucionar este problema incluyo una <f:subview> dentro de cada componente y establecer el ID en él como un parámetro de mi código de componente:

myComponent.xhtml:

<ui:component>  
    <f:subview id="#{id}"> 
     ....component code 
    </f:subview> 
</ui:component> 

y al usarlo en otras páginas es sencillo (Después de configurar taglib.xml y web.xml correctamente):

<myTagLib:myComponent id="myCompA" /> 
+0

Eso resuelve mi problema perfectamente. ¡Gracias a ti Naganalf y BalusC! – mgamer

+1

lo siento por no votar, pero f: la subvista no parece tener la intención de corregir el problema descrito en la publicación que OP menciona. Esto hace algo y algo podría funcionar. – Toskan

4

Sugiero dar un paso atrás e investigar por qué se produce el problema de la identificación duplicada. Una vez que haya identificado la causa raíz, simplemente corrígela de la manera "habitual" en lugar de crear su propio componente UINamingContainer.

Hay varias causas posibles de errores de identificación duplicados que deberían ayudar a que más clavándola abajo:

  • La misma ID se utiliza en diferentes UIComponent s dentro del mismo componente UINamingContainer.
  • físicamente diferentes componentes están unidos a la mismoUIComponent propiedad de la mismo bean.
  • JSP única: la f:subview se ha declarado en la página padres en lugar de la incluyen página.
  • El mismo incluyen página se incluye múltiple veces dentro del mismo componente UINamingContainer.
  • Se ha creado dinámicamente un componente (por ejemplo, new UIComponent()) sin con una ID asignada.

Aquí, UINamingContainer está bajo la cada <h:form>, <h:dataTable> y <f:subview>.

Si las sugerencias anteriores no ayuda, a continuación, actualizar su pregunta para incluir el más pequeño fragmento de código posible (por lo tanto, sin todo el código irrelevante/desorden como componentes no relacionados, bibliotecas, HTML/CSS/JS/etc) los cuales reproduce el mismo problema exactamente con solo copiarlo sin ejecutarlo sin ningún cambio.

+1

Esto es como el siguiente al último escenario. Tengo un componente personalizado facelets que incluyo varias veces dentro de la misma página. Mi componente facelets contiene a4j: outputPanel con la id problemática. Necesito esta identificación para poder reenviar el a4j: outputPanel. Envolviendo el contenido de mi componente dentro de h: el formulario no me parece una buena opción. Prefiero ponerlo dentro de algunos facelets, provisto UINamingContainer, pero reconozco que no existe tal cosa. – mgamer

+1

JSF 1.xo 2.x? ¿Dónde está invocando la redención, dentro o fuera del componente personalizado? ¿Qué quiere decir exactamente con "componente personalizado", solo 'ui: composition'? – BalusC

+0

Acabo de encontrarme con el mismo problema al crear mis primeros componentes de facelets. Compartiré lo que funcionó para mí en otra respuesta (cuando regrese del almuerzo). Es posible que desee actualizar su pregunta para ser más específico. – Naganalf

Cuestiones relacionadas