Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Action do commandButton aparentemente não invoca o método.

Tenho o seguinte xhtml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://xmlns.jcp.org/jsf/html"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">

<ui:composition template="../templates/_template.xhtml">
    <ui:define name="conteudo">
        <h:form id="cadastrarUsuario">
            <p:fieldset legend="Cadastro de Usuário">
                <h:panelGrid columns="2">

                    <h:outputLabel value="Nome:" for="nome" />
                    <h:inputText id="nome"
                        value="#{usuarioBean.usuario.pessoaFisica.noPessoa}">
                    </h:inputText>

                    <h:outputLabel value="CPF:" for="cpf" />
                    <h:inputText id="cpf"
                        value="#{usuarioBean.usuario.pessoaFisica.nrCpf}" required="true">
                    </h:inputText>

                    <h:outputLabel value="E-mail:" for="email" />
                    <h:inputText id="email"
                        value="#{usuarioBean.usuario.pessoaFisica.dsEmail}">
                    </h:inputText>

                    <h:outputLabel value="Matricula:" for="martricula" />
                    <h:inputText id="martricula"
                        value="#{usuarioBean.usuario.pessoaFisica.nrMatricula}">
                    </h:inputText>

                    <h:outputLabel value="Login" for="login" />
                    <h:inputText id="login" value="#{usuarioBean.usuario.noLogin}">
                    </h:inputText>

                    <h:outputLabel value="Orgao" for="orgao" />
                    <h:inputText id="orgao" value="#{usuarioBean.usuario.orgao.id}">
                    </h:inputText>

                    <h:outputLabel value="Ativo" for="isAtivo" />
                    <h:inputText id="isAtivo" value="#{usuarioBean.usuario.isAtivo}">
                    </h:inputText>

                    <h:outputLabel value="Administrador" for="isAdmin" />
                    <h:inputText id="isAdmin" value="#{usuarioBean.usuario.isAdmin}">
                    </h:inputText>
                </h:panelGrid>
                <h:panelGrid columns="2">
                    <p:commandButton value="Voltar" id="voltar"
                        action="#{usuarioBean.voltar}" icon="fa fa-step-backward" />
                    <p:commandButton value="Cadastrar" id="cadastrarUsuario"
                        action="#{usuarioBean.salvar}" icon="fa fa-save" process="@form" />
                </h:panelGrid>
            </p:fieldset>
        </h:form>
    </ui:define>
</ui:composition>

</html>

Porém ao clicar no botão "Cadastrar" o método do meu ManagedBean, não é invocado.

Detalhe 1: Em outro xhtml consigo invocar métodos desse mesmo managedBean que só me retorna uma String.

Detalhe 2: Estou jogando no console as fases do JSF, e ao clicar no botão ele faz as fases 1,2,3 e 6.

FASE: RESTORE_VIEW 1 FASE: APPLY_REQUEST_VALUES 2 FASE: PROCESS_VALIDATIONS 3 FASE: RENDER_RESPONSE 6

Segue código do meu MB:

@Controller
@Scope("request") 
public class UsuarioBean {

    @Autowired
    private UsuarioService usuarioService;

    private Usuario usuario = new Usuario();


    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public List<Usuario> getUsuarios(){
        return usuarioService.getAll();
    }

    public String salvar(){
        usuarioService.incluir(usuario);
        return "Index";
    }

}

Alguém tem ideia do que possa estar acontecendo?

3 respostas
solução!

Olá Edimilson,

Se ele está indo da fase PROCESS_VALIDATIONS direto para RENDER_RESPONSE, provavelmente está dando algum problema na validação/conversão dos dados.

Coloque o componente <h:messages/> nessa tela e verifique se é exibido alguma informação de erro ao executar esse fluxo.

Só por curiosidade coloca a opção

immediate="true"

No seu botão, e testa para ver

O que estava acontecendo era um erro no mapeamento de uma das propriedades dos meus domains, dentro no MB.

Com o isso ficou claro logo de cara.

Obrigado pessoal.