e você também não vê nenhum erro e / ou aviso no Google no console JavaScript do navegador (pressione F12 no Chrome / Firefox23 + / IE9 + para abrir o conjunto de ferramentas para desenvolvedores da Web e, em seguida, abra a guia Console ) e, em seguida, trabalhe na lista abaixo de possíveis causas.
UICommande os UIInputcomponentes devem ser colocados dentro de um UIFormcomponente, por exemplo <h:form>(e, portanto, não HTML simples <form>), caso contrário, nada poderá ser enviado ao servidor. UICommandOs componentes também não devem ter type="button"atributo, caso contrário, será um botão morto, útil apenas para JavaScript onclick. Consulte também Como enviar valores de entrada de formulário e chamar um método no bean JSF e <h: commandButton> não inicia uma postagem .
Você não pode aninhar vários UIFormcomponentes um no outro. Isso é ilegal em HTML. O comportamento do navegador não é especificado. Cuidado com os arquivos incluídos! Você pode usar UIFormcomponentes em paralelo, mas eles não se processam durante o envio. Você também deve tomar cuidado com o antipadrão "Forma de Deus"; certifique-se de não processar / validar acidentalmente todas as outras entradas (invisíveis) da mesma forma (por exemplo, ter um diálogo oculto com as entradas necessárias da mesma forma). Consulte também Como usar <h: form> na página JSF? Formulário único? Múltiplos formulários? Formulários aninhados? .
Nenhum UIInputerro de validação / conversão de valor deveria ter ocorrido. Você pode usar <h:messages>para mostrar qualquer mensagem que não seja mostrada por nenhum <h:message>componente específico de entrada . Não se esqueça de incluir o idde <h:messages>no <f:ajax render>, se houver, para que ele seja atualizado também nos pedidos do ajax. Consulte também h: messages não exibe mensagens quando p: commandButton é pressionado .
Se UICommandou UIInputcomponentes forem colocados dentro de um componente de iteração, como <h:dataTable>, <ui:repeat>etc, será necessário garantir que exatamente o mesmo valuecomponente de iteração seja preservado durante a fase de aplicar valores da solicitação de envio de formulário. O JSF reiterará sobre ele para encontrar o link / botão clicado e os valores de entrada enviados. Colocar o bean no escopo da visualização e / ou garantir que você carregue o modelo de dados no @PostConstructbean (e, portanto, não em um método getter!) Deve corrigi-lo. Consulte também Como e quando devo carregar o modelo do banco de dados para h: dataTable .
Se UICommandou UIInputcomponentes forem incluídos por uma fonte dinâmica como <ui:include src="#{bean.include}">, então, você precisará garantir que exatamente o mesmo #{bean.include}valor seja preservado durante o tempo de construção da exibição da solicitação de envio do formulário. O JSF o reexecutará durante a construção da árvore de componentes. Colocar o bean no escopo da visualização e / ou garantir que você carregue o modelo de dados no @PostConstructbean (e, portanto, não em um método getter!) Deve corrigi-lo. Consulte também Como incluir o conteúdo dinâmico do ajax-refresh dynamic pelo menu de navegação? (SPA JSF) .
O renderedatributo do componente e todos os seus pais e o testatributo de qualquer pai <c:if>/ mãe <c:when>não devem ser avaliados falsedurante a fase de aplicar valores de solicitação da solicitação de envio do formulário. O JSF o verificará novamente como parte da proteção contra solicitações adulteradas / invadidas. Armazenar as variáveis responsáveis pela condição em um @ViewScopedbean ou garantir que você esteja pré-inicializando corretamente a condição em @PostConstructum @RequestScopedbean deve corrigi-lo. O mesmo se aplica ao disabledatributo do componente, que não deve ser avaliado truedurante a fase de aplicar valores de solicitação. Consulte também Ação CommandButton do JSF não invocada , O envio do formulário no componente renderizado condicionalmente não é processado eh: commandButton não está funcionando depois que eu o envolvo em um <h: panelGroup renderizado> .
O onclickatributo do UICommandcomponente e o onsubmitatributo do UIFormcomponente não devem retornar falseou causar um erro de JavaScript. No caso de, <h:commandLink>ou <f:ajax>também, não há erros de JS visíveis no console de JS do navegador. Normalmente, pesquisar a mensagem de erro exata no Google já dará a resposta. Consulte também Adicionando / carregando manualmente resultados do jQuery com PrimeFaces nos UnEaught TypeErrors .
Se você estiver usando o Ajax via JSF 2.x <f:ajax>ou, por exemplo <p:commandXxx>, PrimeFaces , verifique se possui um <h:head>no modelo mestre em vez do <head>. Caso contrário, o JSF não poderá incluir automaticamente os arquivos JavaScript necessários que contêm as funções do Ajax. Isso resultaria em um erro de JavaScript como "mojarra não está definido" ou "PrimeFaces não está definido" no console JS do navegador. Consulte também o listener de ação h: commandLink não é chamado quando usado com f: ajax e ui: repeat .
Se você estiver usando Ajax, e os valores apresentados acabam sendo null, em seguida, certifique-se de que os UIInpute UICommandcomponentes de interesse são cobertos pelo <f:ajax execute>ou por exemplo <p:commandXxx process>, caso contrário não será executado / processados. Consulte também Valores de formulário enviados não atualizados no modelo ao incluir <f: ajax> em <h: commandButton> e Noções básicas sobre processo / atualização do PrimeFaces e atributos de execução / renderização do JSF f: ajax .
Se os valores enviados ainda acabarem sendo null, e você estiver usando o CDI para gerenciar beans, certifique-se de importar a anotação de escopo do pacote correto, caso contrário, o CDI usará como padrão o @Dependentqual recria efetivamente o bean em todas as avaliações do EL expressão. Consulte também o bean @SessionScoped perde o escopo e é recriado o tempo todo, os campos se tornam nulos e qual é o escopo do Bean gerenciado padrão em um aplicativo JSF 2?
Se um pai do <h:form>com o UICommandbotão de antemão está sendo processado / atualizado por uma solicitação ajax vindo de outra forma na mesma página, em seguida, a primeira ação sempre falhará no JSF 2.2 ou mais velhos. A segunda e subsequente ação funcionará. Isso é causado por um bug na manipulação de estado de exibição, relatado como problema de especificação JSF 790 e atualmente corrigido no JSF 2.3. Para versões mais antigas do JSF, você precisa especificar explicitamente o ID do <h:form>na renderdo <f:ajax>. Consulte também h: commandButton / h: commandLink não funciona no primeiro clique, funciona apenas no segundo clique .
Se o conjunto <h:form>tiver sido enctype="multipart/form-data"configurado para suportar o upload de arquivos, você deverá certificar-se de estar usando pelo menos o JSF 2.2 ou se o filtro de servlet responsável por analisar solicitações de várias partes / dados de formulário está configurado corretamente, caso contrário, FacesServletserá acabam não obtendo nenhum parâmetro de solicitação e, portanto, não podem aplicar os valores da solicitação. Como configurar esse filtro depende do componente de upload de arquivo que está sendo usado. Para Tomahawk <t:inputFileUpload>, verifique esta resposta e, para o PrimeFaces <p:fileUpload>, verifique esta resposta . Ou, se você realmente não estiver carregando um arquivo, remova o atributo completamente.
Certifique-se de que o ActionEventargumento de actionListenerseja um javax.faces.event.ActionEvente, portanto java.awt.event.ActionEvent, não , o que a maioria dos IDEs sugere como a primeira opção de preenchimento automático. Não ter argumentos também está errado se você usar actionListener="#{bean.method}". Se você não quiser um argumento no seu método, use actionListener="#{bean.method()}". Ou talvez você realmente queira usar em actionvez de actionListener. Consulte também Diferenças entre action e actionListener .
Certifique-se de que nenhum PhaseListenerou nenhum EventListenerda cadeia de solicitação-resposta tenha alterado o ciclo de vida do JSF para ignorar a fase de ação de chamada, por exemplo, chamando FacesContext#renderResponse()or FacesContext#responseComplete().
Verifique se nenhuma Filterou Servletna mesma cadeia de solicitação-resposta bloqueou a solicitação de FacesServletalguma forma. Por exemplo, filtros de login / segurança, como Spring Security. Particularmente em solicitações ajax que, por padrão, acabariam sem feedback da interface do usuário. Consulte também manipulação de solicitações Spring Security 4 e PrimeFaces 5 AJAX .
Se você estiver usando um PrimeFaces <p:dialog>ou a <p:overlayPanel>, verifique se eles têm os seus próprios <h:form>. Porque, por padrão, esses componentes são realocados para o JavaScript no final do HTML <body>. Então, se eles estavam originalmente sentados dentro de a <form>, então agora não estavam mais sentados em a <form>. Consulte também p: commandbutton action não funciona dentro de p: dialog
Bug na estrutura. Por exemplo, o RichFaces possui um " erro de conversão " ao usar umrich:calendar elemento da interface do usuário com um defaultLabelatributo (ou, em alguns casos, um rich:placeholdersubelemento). Esse bug impede que o método do bean seja chamado quando nenhum valor for definido para a data do calendário. O rastreamento de erros da estrutura pode ser realizado começando com um exemplo de trabalho simples e criando a página de backup até que o bug seja descoberto.
No caso de você ainda stuck, é hora de depurar. No lado do cliente, pressione F12 no navegador da web para abrir o conjunto de ferramentas do desenvolvedor da web. Clique na guia Console para ver o cone JavaScript. Deve estar livre de erros de JavaScript. A captura de tela abaixo é um exemplo do Chrome que demonstra o caso de enviar um <f:ajax>botão ativado sem ter <h:head>declarado (conforme descrito no ponto 7 acima).
No lado do servidor, verifique se o servidor foi iniciado no modo de depuração. Coloque um ponto de interrupção de depuração em um método do componente JSF de interesse que você espera que seja chamado durante o processamento do envio do formulário. Por exemplo, no caso de UICommandcomponente, isso seria UICommand#queueEvent()e no caso de UIInputcomponente, isso seria UIInput#validate(). Basta percorrer a execução do código e inspecionar se o fluxo e as variáveis são conforme as expectativas. Abaixo da captura de tela, há um exemplo do depurador do Eclipse.