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.
UICommand
e os UIInput
componentes devem ser colocados dentro de um UIForm
componente, por exemplo <h:form>
(e, portanto, não HTML simples <form>
), caso contrário, nada poderá ser enviado ao servidor. UICommand
Os 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 UIForm
componentes um no outro. Isso é ilegal em HTML. O comportamento do navegador não é especificado. Cuidado com os arquivos incluídos! Você pode usar UIForm
componentes 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 UIInput
erro 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 id
de <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 UICommand
ou UIInput
componentes forem colocados dentro de um componente de iteração, como <h:dataTable>
, <ui:repeat>
etc, será necessário garantir que exatamente o mesmo value
componente 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 @PostConstruct
bean (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 UICommand
ou UIInput
componentes 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 @PostConstruct
bean (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 rendered
atributo do componente e todos os seus pais e o test
atributo de qualquer pai <c:if>
/ mãe <c:when>
não devem ser avaliados false
durante 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 @ViewScoped
bean ou garantir que você esteja pré-inicializando corretamente a condição em @PostConstruct
um @RequestScoped
bean deve corrigi-lo. O mesmo se aplica ao disabled
atributo do componente, que não deve ser avaliado true
durante 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 onclick
atributo do UICommand
componente e o onsubmit
atributo do UIForm
componente não devem retornar false
ou 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 UIInput
e UICommand
componentes 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 @Dependent
qual 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 UICommand
botã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 render
do <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, FacesServlet
será 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 ActionEvent
argumento de actionListener
seja um javax.faces.event.ActionEvent
e, 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 action
vez de actionListener
. Consulte também Diferenças entre action e actionListener .
Certifique-se de que nenhum PhaseListener
ou nenhum EventListener
da 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 Filter
ou Servlet
na mesma cadeia de solicitação-resposta bloqueou a solicitação de FacesServlet
alguma 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 defaultLabel
atributo (ou, em alguns casos, um rich:placeholder
subelemento). 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 UICommand
componente, isso seria UICommand#queueEvent()
e no caso de UIInput
componente, 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.