El envío del formulario en el componente condicionalmente procesado no se procesa

Tengo un archivo de etiqueta personalizado con un formulario:

     

Estoy renderizado condicionalmente por ajax como a continuación:

           

Este es el bean de respaldo asociado:

 import javax.faces.bean.ManagedBean; import javax.faces.bean.RequestScoped; @ManagedBean @RequestScoped public class BackingTest { private boolean flag = false; public void printMessage() { System.out.println("hello"); } public void updateFlag() { flag = true; } public boolean getFlag() { return flag; } } 

Cuando hago clic en el primer botón de comando, el método updateFlag() se invoca correctamente y el segundo botón de comando se muestra correctamente. Pero cuando hago clic en el segundo botón de comando, nunca golpea el método printMessage() . En la consola JS del navegador web y el monitor de tráfico HTTP, puedo ver que el evento de click se activa correctamente y que la solicitud XHR POST se está enviando correctamente.

Si elimino el atributo rendered , todo funciona como se espera.

¿Cómo es esto causado y cómo puedo resolverlo? Estoy usando Mojarra 2.1.25.

Su problema concreto es causado por 2 hechos:

  1. Cuando JSF necesita decodificar una acción de envío de formulario, también verifica si el componente se procesa o no (como protección frente a solicitudes pirateadas / manipuladas).
  2. Los beans con scope de solicitud se vuelven a crear en cada solicitud HTTP (¡una solicitud ajax también cuenta como una solicitud!).

En su caso específico, la condición rendered ha evaluado que es false mientras que JSF necesita decodificar la acción de envío de formulario y, por lo tanto, los componentes de entrada / comando no procesados ​​nunca se procesan.

Poner el bean a la vista del scope debería arreglarlo. El ejemplo siguiente supone que JSF 2.x.

 import javax.faces.bean.ManagedBean; import javax.faces.bean.ViewScoped; @ManagedBean @ViewScoped 

Y a continuación el ejemplo asume JSF 2.2+ con CDI:

 import javax.inject.Named; import javax.faces.view.ViewScoped; @Named @ViewScoped 

Ver también:

  • commandButton / commandLink / ajax action / listener method no invocado o input value no actualizado – point 5
  • ¿Cómo elegir el scope del frijol correcto?