print org libreria framework con jsf primefaces wildfly

jsf - org - primefaces components



La acción del botón JSF se activó dos veces (2)

Ya hice esta pregunta en el foro de WildFly, pero hasta ahora no obtuve ninguna respuesta. Así que estoy intentando aquí.

Desde que actualicé desde WildFly 8.1 a 8.2 tengo problemas con un CommandButton dentro de un tabView conectado a un bean.

Aquí hay una página JSF simple:

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:p="http://primefaces.org/ui"> <h:head></h:head> <h:body> <h:form> <p:tabView binding="#{testBean.tabView}"> <p:tab title="Tab"> <p:commandButton value="Inside" action="#{testBean.testInside}"/> </p:tab> </p:tabView> <p:commandButton value="Outside" action="#{testBean.testOutside}"/> </h:form> </h:body> </html>

y el frijol:

@Named @SessionScoped public class TestBean implements Serializable { private TabView tabView = new TabView(); public TabView getTabView() { return tabView; } public void setTabView(TabView tabView) { this.tabView = tabView; } public void testInside() { System.out.println("inside"); } public void testOutside() { System.out.println("outside"); } }

Al hacer clic en el botón "Dentro", se activa testInside() dos veces. El botón "Exterior" (fuera de tabView) se comporta normalmente y activa su método solo una vez. Al eliminar el enlace de tabView se elimina el problema. Estoy usando PrimeFaces 4.0.

Gracias por cualquier idea

Ene


Puedes intentar hacerlo de otra manera. Use remoteCommand fuera de la pestaña con la misma acción del commandButton.
Luego use la función JavaScript creada por remoteCommand en el evento onclick del CommandButton.
Aquí está el ejemplo usando tu código.
Es funcional.

<h:form> <p:remoteCommand id="myfun" name="myfun" action="#{testBean.testInside}" /> <p:tabView binding="#{testBean.tabView}"> <p:tab title="Tab"> <p:commandButton value="Inside" onclick="myfun();"/> </p:tab> </p:tabView> </h:form>


Es un ''problema'' de Mojarra , introducido por una solución de optimización de rendimiento en 2.2.7.

este es un "problema" de Mojarra, lo he descubierto al trabajar en RF-13920, fue presentado por JAVASERVERFACES-3193. Los componentes que usan el enlace no se vuelven a crear durante una solicitud al servidor, pero sí sus hijos. Con los hijos originales todavía en su lugar, insertar los nuevos hijos provoca el error de "identificación duplicada".

Parece que tu botón se ha agregado dos veces, pero como no tienes una identificación explícita asignada, no obtienes el error de identificación duplicada ... Puede ser interesante intentarlo (agregar una identificación explícita)

La especificación JSF establece que el enlace solo se debe usar en el alcance de la solicitud, por lo que no creo que deba tratarse como un error si esto falla en el alcance de la conversación.

La última observación es la más interesante. Como se publica en la siguiente publicación en el sitio de jboss:

Pero ahora creo que tengo una solución satisfactoria para este problema y puedo confirmar que con los beans de respaldo con alcance de solicitud para el enlace de componentes, el problema de la excepción y el problema de identificación duplicada ya no ocurre, incluso con Mojarra 2.2.8 de Wildfly-8.2. 0.Final!

Esto es cierto incluso si el resto de la lógica de la página permanece en un bean con ámbito de conversación (por ejemplo). Solo necesita tener un bean con ámbito de solicitud para el atributo de enlace, que luego se puede referenciar en EL y otros beans.

Verifique también esta publicación