y tampoco está viendo ningún error o advertencia de Google en la consola JavaScript del navegador (presione F12 en Chrome / Firefox23 + / IE9 + para abrir el conjunto de herramientas de desarrollador web y luego abra la pestaña Consola ), luego revise la lista a continuación de las posibles causas.
UICommand
y los UIInput
componentes deben colocarse dentro de un UIForm
componente, por ejemplo <h:form>
(y, por lo tanto, no HTML simple <form>
), de lo contrario no se puede enviar nada al servidor. UICommand
los componentes tampoco deben tener type="button"
atributo, de lo contrario será un botón muerto que solo es útil para JavaScript onclick
. Consulte también Cómo enviar valores de entrada de formulario e invocar un método en JSF bean y <h: commandButton> no inicia una devolución de datos .
No puede anidar múltiples UIForm
componentes entre sí. Esto es ilegal en HTML. El comportamiento del navegador no está especificado. ¡Cuidado con los archivos de inclusión! Puede usar UIForm
componentes en paralelo, pero no se procesarán entre sí durante el envío. También debe tener cuidado con el antipatrón "Forma de Dios"; asegúrese de no procesar / validar involuntariamente todas las demás entradas (invisibles) en la misma forma (por ejemplo, tener un diálogo oculto con las entradas requeridas en la misma forma). Consulte también ¿Cómo usar <h: form> en la página JSF? Forma individual? Formas múltiples? Formas anidadas? .
No UIInput
debería haberse producido ningún error de validación / conversión de valor. Puede usar <h:messages>
para mostrar cualquier mensaje que no se muestre en ningún <h:message>
componente específico de entrada . No olvide incluir el id
de <h:messages>
en el <f:ajax render>
, si lo hay, para que también se actualice en las solicitudes de ajax. Consulte también h: messages no muestra mensajes cuando se presiona p: commandButton .
Si se colocan UICommand
o UIInput
componentes dentro de un componente iterativo como <h:dataTable>
, <ui:repeat>
etc., entonces debe asegurarse de que value
se conserve exactamente el mismo componente iterativo durante la fase de solicitud de valores de solicitud de la solicitud de envío de formulario. JSF reiterará sobre él para encontrar el enlace / botón cliqueado y los valores de entrada enviados. Poner el bean en el alcance de la vista y / o asegurarse de cargar el modelo de datos @PostConstruct
del bean (y, por lo tanto, no en un método getter) debería solucionarlo. Consulte también Cómo y cuándo debo cargar el modelo de la base de datos para h: dataTable .
Si una fuente dinámica incluye componentes UICommand
o UIInput
componentes <ui:include src="#{bean.include}">
, entonces debe asegurarse de que #{bean.include}
se conserve exactamente el mismo valor durante el tiempo de creación de la vista de la solicitud de envío de formulario. JSF lo volverá a ejecutar durante la construcción del árbol de componentes. Poner el bean en el alcance de la vista y / o asegurarse de cargar el modelo de datos @PostConstruct
del bean (y, por lo tanto, no en un método getter) debería solucionarlo. Consulte también ¿Cómo ajax-refresh dynamic incluye contenido por menú de navegación? (JSF SPA) .
El rendered
atributo del componente y todos sus elementos test
primarios y el atributo de cualquier elemento primario <c:if>
/ <c:when>
no deben evaluarse false
durante la fase de solicitud de valores de solicitud del formulario de solicitud de envío. JSF lo volverá a verificar como parte de la protección contra solicitudes manipuladas / pirateadas. Almacenar las variables responsables de la condición en un @ViewScoped
bean o asegurarse de que está preinicializando adecuadamente la condición @PostConstruct
de un @RequestScoped
bean debería solucionarlo. Lo mismo se aplica al disabled
atributo del componente, que no debe evaluarse true
durante la fase de solicitud de valores de solicitud. Consulte también la acción JSF CommandButton no invocada , el envío del formulario en el componente condicionalmente procesado no se procesa yh: commandButton no funciona una vez que lo envuelvo en un <h: panelGroup renderizado> .
El onclick
atributo del UICommand
componente y el onsubmit
atributo del UIForm
componente no deberían retornar false
ni causar un error de JavaScript. No debería, en caso de <h:commandLink>
o <f:ajax>
también haber errores JS visibles en la consola JS del navegador. Por lo general, buscar en Google el mensaje de error exacto ya le dará la respuesta. Consulte también Agregar / cargar manualmente jQuery con resultados de PrimeFaces en TypeErrors no capturados .
Si está utilizando Ajax a través de JSF 2.xo, <f:ajax>
por ejemplo <p:commandXxx>
, PrimeFaces , asegúrese de tener una <h:head>
plantilla maestra en lugar de la <head>
. De lo contrario, JSF no podrá incluir automáticamente los archivos JavaScript necesarios que contienen las funciones de Ajax. Esto daría lugar a un error de JavaScript como "mojarra no está definido" o "PrimeFaces no está definido" en la consola JS del navegador. Ver también h: commandLink actionlistener no se invoca cuando se usa con f: ajax y ui: repeat .
Si está utilizando Ajax, y los valores enviados terminan siendo null
, entonces asegúrese de que los componentes UIInput
y UICommand
de interés estén cubiertos por <f:ajax execute>
o <p:commandXxx process>
, por ejemplo , de lo contrario no se ejecutarán / procesarán. Consulte también Valores de formulario enviados no actualizados en el modelo al agregar <f: ajax> a <h: commandButton> y Entender el proceso / actualización de PrimeFaces y los atributos JSF f: ajax execute / render .
Si los valores enviados aún terminan siendo null
, y está utilizando CDI para administrar beans, entonces asegúrese de importar la anotación del alcance desde el paquete correcto, de lo contrario, CDI volverá a los valores predeterminados para @Dependent
recrear efectivamente el bean en cada evaluación individual de EL expresión. Consulte también @SessionScoped bean pierde alcance y se recrea todo el tiempo, los campos se vuelven nulos y ¿Cuál es el alcance de Bean administrado predeterminado en una aplicación JSF 2?
Si un padre del <h:form>
con el UICommand
botón se ha procesado / actualizado previamente por una solicitud ajax proveniente de otro formulario en la misma página, entonces la primera acción siempre fallará en JSF 2.2 o anterior. La segunda y posteriores acciones funcionarán. Esto se debe a un error en el manejo del estado de la vista que se informa como problema 790 de especificación JSF y actualmente se soluciona en JSF 2.3. Para versiones anteriores de JSF, debe especificar explícitamente el ID de <h:form>
en el render
de <f:ajax>
. Consulte también h: commandButton / h: commandLink no funciona en el primer clic, solo funciona en el segundo clic .
Si se <h:form>
ha enctype="multipart/form-data"
configurado para admitir la carga de archivos, debe asegurarse de que está utilizando al menos JSF 2.2, o que el filtro de servlet que es responsable de analizar las solicitudes de datos multiparte / formulario está configurado correctamente; de lo contrario FacesServlet
, terminan sin obtener ningún parámetro de solicitud y, por lo tanto, no pueden aplicar los valores de solicitud. La forma de configurar dicho filtro depende del componente de carga de archivos que se utilice. Para Tomahawk <t:inputFileUpload>
, verifique esta respuesta y para PrimeFaces <p:fileUpload>
, verifique esta respuesta . O, si en realidad no está cargando un archivo, elimine el atributo por completo.
Asegúrese de que el ActionEvent
argumento de actionListener
sea javax.faces.event.ActionEvent
y, por lo tanto java.awt.event.ActionEvent
, no , que es lo que la mayoría de los IDE sugieren como primera opción de autocompletar. No tener argumento es malo también si lo usas actionListener="#{bean.method}"
. Si no quieres una discusión en tu método, úsalo actionListener="#{bean.method()}"
. O tal vez realmente quieras usar en action
lugar de actionListener
. Consulte también Diferencias entre action y actionListener .
Asegúrese de que ninguno PhaseListener
o ninguno EventListener
en la cadena de solicitud-respuesta haya cambiado el ciclo de vida de JSF para omitir la fase de acción de invocación, por ejemplo, llamando FacesContext#renderResponse()
o FacesContext#responseComplete()
.
Asegúrese de que ninguna Filter
o Servlet
en la misma cadena de solicitud-respuesta haya bloqueado la solicitud de FacesServlet
alguna manera. Por ejemplo, filtros de inicio de sesión / seguridad como Spring Security. Particularmente en las solicitudes ajax que, de forma predeterminada, terminarían sin comentarios de la interfaz de usuario. Consulte también Spring Security 4 y PrimeFaces 5 AJAX gestión de solicitudes .
Si está utilizando PrimeFaces <p:dialog>
o a <p:overlayPanel>
, asegúrese de que tengan los suyos <h:form>
. Debido a que estos componentes son reubicados por JavaScript de manera predeterminada al final de HTML <body>
. Entonces, si originalmente estaban sentados dentro de a <form>
, ahora ya no se sentarían en a <form>
. Ver también p: commandbutton action no funciona dentro de p: dialog
Error en el marco. Por ejemplo, RichFaces tiene un " error de conversión " cuando utiliza un rich:calendar
elemento de la interfaz de usuario con un defaultLabel
atributo (o, en algunos casos, un rich:placeholder
subelemento). Este error evita que se invoque el método del bean cuando no se establece ningún valor para la fecha del calendario. El seguimiento de los errores del marco se puede lograr comenzando con un ejemplo de trabajo simple y construyendo la página nuevamente hasta que se descubra el error.
En caso de que sigas pegado, es hora de depurar. En el lado del cliente, presione F12 en el navegador web para abrir el conjunto de herramientas de desarrollador web. Haga clic en la pestaña Consola para ver el código JavaScript. Debe estar libre de errores de JavaScript. La captura de pantalla siguiente es un ejemplo de Chrome que demuestra el caso de enviar un <f:ajax>
botón habilitado sin haber <h:head>
declarado (como se describe en el punto 7 anterior).
En el lado del servidor, asegúrese de que el servidor se inicie en modo de depuración. Coloque un punto de interrupción de depuración en un método del componente JSF de interés al que espera que se le llame durante el procesamiento del envío del formulario. Por ejemplo, en el caso del UICommand
componente, sería UICommand#queueEvent()
y en el caso del UIInput
componente, sería UIInput#validate()
. Simplemente realice la ejecución del código e inspeccione si el flujo y las variables son según las expectativas. La captura de pantalla siguiente es un ejemplo del depurador de Eclipse.