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
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" />
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 componenteUINamingContainer
. - físicamente diferentes componentes están unidos a la mismo
UIComponent
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.
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
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
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
- 1. C++ Cómo crear un contenedor heterogéneo
- 2. Crear XML con JSF
- 3. Correr JSF 2.0 en Servlet 2.4 contenedor
- 4. Cómo crear campos de formulario JSF dinámicos
- 5. contenedor para la búsqueda rápida de nombres
- 6. Cómo crear un contenedor de elementos no procesables
- 7. ¿Cómo puedo crear un contenedor de rutas en Gradle?
- 8. ¿Cómo crear una matriz en JSF EL?
- 9. ¿Cómo crear un contenedor con bibliotecas externas incluidas en Eclipse?
- 10. Cómo crear un contenedor para una llamada asincrónica?
- 11. Crear un contenedor de tareas alrededor de un objeto existente
- 12. Crear columnas de tabla dinámicamente en JSF
- 13. ¿Cómo ejecuto un contenedor desde el interior de un contenedor?
- 14. ¿Cómo crear variables privadas dentro de un espacio de nombres?
- 15. JSF 1.2: ¿Puedo crear un componente reutilizable dentro de la vista JSF
- 16. ¿qué dicta la versión JSF? Contenedor o faces-config?
- 17. Distribución de un contenedor
- 18. C# /. NET ¿Cómo puedo encontrar el espacio de nombres contenedor de un nombre de clase
- 19. ¿Cómo crear mensajes 404 personalizados en JSF 2.0?
- 20. Crear un contenedor para una biblioteca C en Python
- 21. ¿Cómo elegir un contenedor DI?
- 22. Cómo crear un contenedor de controlador de vista personalizado usando el guión gráfico en iOS 5
- 23. ¿Cómo hacer un componente reutilizable en JSF?
- 24. Cómo redirigir a un ancla en JSF?
- 25. JSF 2 - ¿Cómo puedo obtener un valor de parámetro de contexto de web.xml usando JSF EL?
- 26. ¿Es posible crear un espacio de nombres en jQuery?
- 27. Crear un alias a otro espacio de nombres Clojure
- 28. Cómo crear un contenedor secundario en una ubicación de almacenamiento azul
- 29. JSF 2.0 ¿Cómo usar Eclipse?
- 30. JSF 2 ManagedProperty inyección de bean desde el contenedor de dependencia
Eso resuelve mi problema perfectamente. ¡Gracias a ti Naganalf y BalusC! – mgamer
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