Problema com commandLink JSF

43 respostas
E

Pessoal ,tenho o seguinte command link do JSF

<h:commandLink title="Voltar"   
                     action="#{clienteMB.voltar}"   
                     style="margin-left:20px">   
          <h:graphicImage url="/imagens/voltar.jpg"   
                          style="border:0"/>   
  
      </h:commandLink>

Metodo Voltar do MB

public void voltar() {   
    System.out.println("entroo");   
    HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();   
    try {   
        response.sendRedirect("menu.xhtml");   
    } catch (IOException ex) {   
       JSFUtil.enviarMenssagemErro("Erro ao voltar");   
    }   
}

OU

public void voltar() {   
    return "menu.xhtml"
}

Nenhum funciona

quando acionado o commadlink ele da um nullpointer na pagina,ele NÃO ENTRA no metodo voltar…o tomcat nem exibe o erro no console ,alguem sabe o porque?

abaixo tem o codigo fonte inteiro mais melhor entendimento.

<?xml version="1.0" encoding="ISO-8859-1" ?>   
<!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://java.sun.com/jsf/html"   
      xmlns:p="http://primefaces.prime.com.tr/ui"   
      xmlns:f="http://java.sun.com/jsf/core"   
      xmlns:ui="http://java.sun.com/jsf/facelets">   
    <h:head>   
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />   
        <title>Cadastro de Cliente</title>   
        <script type="text/javascript">   
            function validarApagar(xhr, status, args){   
                var isClienteSelecionado = args.isClienteSelecionado;   
                if(isClienteSelecionado){   
                   dlgExclui.show();   
                }   
            }   
              function validarAlterar(xhr, status, args){   
                var alterou = args.alterou;   
                    if(alterou) {   
                        dlgCliente.hide();   
                }   
            }   
        </script>   
    </h:head>   
  
    <f:view locale="pt_br">   
        <h:body>   
            <h:form>   
                <p:toolbar>   
                    <p:toolbarGroup align="left">   
                        <p:menuButton value="Cadastro"   
                                      rendered="#{menuMB.administrator or menuMB.simples}">   
                            <p:menuitem value="Usuários"   
                                        action="#{menuMB.irUsuario}"   
                                        ajax="false"   
                                        rendered="#{menuMB.administrator}"/>   
                            <p:menuitem value="Clientes"   
                                        action="#{menuMB.irCliente}"   
                                        ajax="false"   
                                        rendered="#{menuMB.administrator or menuMB.simples}"/>   
                        </p:menuButton>   
                    </p:toolbarGroup>   
                    <p:toolbarGroup align="left">   
                        <p:menuButton value="Processo">   
                            <p:menuitem value="Manter Fotos"   
                                        action="#{menuMB.irAlbum}"   
                                        ajax="false"   
                                        rendered="#{menuMB.administrator or menuMB.simples}"/>   
                            <p:menuitem value="Selecionar Fotos"   
                                        rendered="#{menuMB.cliente}"   
                                        action="#{menuMB.irVisualizacaoAlbum}"   
                                        ajax="false"/>   
                        </p:menuButton>   
                    </p:toolbarGroup>   
                    <p:toolbarGroup align="left">   
                        <p:menuButton value="Sair">   
                            <p:menuitem value="Sair"   
                                        action="#{menuMB.sair}"   
                                        ajax="false"/>   
  
                        </p:menuButton>   
                    </p:toolbarGroup>   
                </p:toolbar>   
            </h:form>   
            <h:form id="frmGridCliente" >   
                <p:growl id="menssagensCliente"   
                         life="5000"/>   
                <p:dataTable id="dtClientes"   
                             widgetVar="dtClientes"   
                             var="cliente"   
                             value="#{clienteMB.clientes}"   
                             paginator="true"   
                             rows="5"   
                             selection="#{clienteMB.cliente}"   
                             selectionMode="single"   
                             rowSelectListener="#{clienteMB.selecionarCliente}"   
                             onRowSelectComplete="dlgCliente.show();"   
                             emptyMessage="Nao existe Cliente cadastrado"   
                             style="width:100%"   
                             update="frmCadastroCliente:itxNome, frmCadastroCliente:mskCpf, frmCadastroCliente:itxEmail ,frmCadastroCliente:itxSenha,  frmCadastroCliente:mskCelular, frmCadastroCliente:mskTelefone, frmCadastroCliente:cldDataNascimento, frmCadastroCliente:sorEnviaSms, frmCadastroCliente:sorEnviaEmail, frmCadastroCliente:clkGravar, frmCadastroCliente:clkAlterar, frmCadastroCliente:clkAlterarSenha">   
                    <p:column sortBy="#{cliente.nome}"   
                              filterBy="#{cliente.nome}">   
                        <f:facet name="header">   
                            <h:outputText value="Nome" />   
                        </f:facet>   
                        <h:outputText value="#{cliente.nome}" />   
                    </p:column>   
                    <p:column sortBy="#{cliente.cpf}"   
                              filterBy="#{cliente.cpf}">   
                        <f:facet name="header">   
                            <h:outputText value="CPF" />   
                        </f:facet>   
                        <h:outputText value="#{cliente.cpf}" />   
                    </p:column>   
                    <p:column sortBy="#{cliente.dataNascimento}"   
                              filterBy="#{cliente.dataNascimento}">   
                        <f:facet name="header">   
                            <h:outputText value="Data Nascimento"  />   
                        </f:facet>   
                        <h:outputText value="#{cliente.dataNascimento}">   
                            <f:convertDateTime locale="pt_br"/>   
                        </h:outputText>   
                    </p:column>   
                    <p:column sortBy="#{cliente.email}"   
                              filterBy="#{cliente.email}">   
                        <f:facet name="header">   
                            <h:outputText value="Email" />   
                        </f:facet>   
                        <h:outputText value="#{cliente.email}" />   
                    </p:column>   
                    <p:column sortBy="#{cliente.senha}"   
                              filterBy="#{cliente.senha}">   
                        <f:facet name="header">   
                            <h:outputText value="Senha" />   
                        </f:facet>   
                        <h:outputText value="#{cliente.senha}" />   
                    </p:column>   
                    <p:column sortBy="#{cliente.celular}"   
                              filterBy="#{cliente.celular}">   
                        <f:facet name="header">   
                            <h:outputText value="Celular" />   
                        </f:facet>   
                        <h:outputText value="#{cliente.celular}" />   
                    </p:column>   
                </p:dataTable>   
                <p:panel style="width:99.2%">   
                    <p:commandLink id="clkIncluir"   
                                   title="Incluir"   
                                   oncomplete="dlgCliente.show()"   
                                   action="#{clienteMB.incluir}"   
                                   update="frmCadastroCliente:itxNome, frmCadastroCliente:mskCpf, frmCadastroCliente:itxEmail ,frmCadastroCliente:itxSenha,  frmCadastroCliente:mskCelular, frmCadastroCliente:mskTelefone, frmCadastroCliente:cldDataNascimento, frmCadastroCliente:sorEnviaSms, frmCadastroCliente:frmCadastroCliente:sorEnviaEmail, frmCadastroCliente:clkGravar, frmCadastroCliente:clkAlterar">   
                        <h:graphicImage url="/imagens/novo.jpg"   
                                        style="border:0"/>   
                    </p:commandLink>   
                    <p:commandLink title="Apagar"   
                                   style="margin-left:20px"   
                                   actionListener="#{clienteMB.validarApagar}"   
                                   oncomplete="validarApagar(xhr, status, args)"   
                                   update="frmGridCliente:menssagensCliente"   
                                   process="frmGridCliente">   
                        <h:graphicImage url="/imagens/apagar.jpg"   
                                        style="border:0"/>   
                    </p:commandLink>   
                    <h:commandLink title="Voltar"   
                                   action="#{clienteMB.voltar}"   
                                   style="margin-left:20px">   
                        <h:graphicImage url="/imagens/voltar.jpg"   
                                        style="border:0"/>   
  
                    </h:commandLink>   
                </p:panel>   
                <p:dialog widgetVar="dlgExclui"   
                          header="Deseja apagar o cliente?"   
                          modal="true">   
                    <h:panelGrid columns="2">   
                        <p:commandLink title="Sim"   
                                       actionListener="#{clienteMB.apagar}"   
                                       style="margin-left:40px"   
                                       update="frmGridCliente"   
                                       oncomplete="dlgCliente.hide(); dlgExclui.hide();">   
                            <h:graphicImage url="/imagens/sim.jpg"   
                                            style="border:0"/>   
                        </p:commandLink>   
                        <p:commandLink title="Não"   
                                       style="margin-left:75px"   
                                       oncomplete="dlgCliente.hide(); dlgExclui.hide();">   
                            <h:graphicImage url="/imagens/nao.jpg"   
                                            style="border:0"/>   
                        </p:commandLink>   
                    </h:panelGrid>   
                </p:dialog>   
  
            </h:form>   
            <h:form id="frmCadastroCliente">   
                <p:dialog id="dlgCliente"   
                          widgetVar="dlgCliente"   
                          header="Cliente"   
                          width="500"   
                          closable="false">   
                    <h:panelGrid columns="2">   
                        <h:outputLabel value="Nome:"   
                                       for="itxNome" />   
                        <p:inputText id="itxNome"   
                                     value="#{clienteMB.cliente.nome}"   
                                     size="35"   
                                     required="true"   
                                     requiredMessage="Informe o Nome"/>   
                        <h:outputLabel value="CPF:"   
                                       for="mskCpf" />   
                        <p:inputMask id="mskCpf"   
                                     mask="[CPF removido]"   
                                     value="#{clienteMB.cliente.cpf}"   
                                     required="true"   
                                     requiredMessage="Informe o Cpf"/>   
                        <h:outputLabel value="Data Nascimento:"   
                                       for="cldDataNascimento" />   
                        <p:calendar id="cldDataNascimento"   
                                    value="#{clienteMB.cliente.dataNascimento}"   
                                    locale="pt_br"   
                                    readOnlyInputText="true"   
                                    navigator="true"   
                                    yearRange="-111:+39"   
                                    pattern="dd/MM/yyyy"/>   
                        <h:outputLabel value="Celular:"   
                                       for="mskCelular" />   
                        <p:inputMask id="mskCelular"   
                                     mask="999-9999-9999"   
                                     value="#{clienteMB.cliente.celular}"   
                                     required="true"   
                                     requiredMessage="Informe o celular"/>   
                        <h:outputLabel value="Telefone:"   
                                       for="mskTelefone" />   
                        <p:inputMask id="mskTelefone"   
                                     mask="999-9999-9999"   
                                     value="#{clienteMB.cliente.telefone}"/>   
                        <h:outputLabel value="E-mail:"   
                                       for="itxEmail"/>   
                        <p:inputText id="itxEmail"   
                                     value="#{clienteMB.cliente.email}"   
                                     size="35"   
                                     required="true"   
                                     requiredMessage="Informe o Email"/>   
                        <h:outputLabel value="Senha"   
                                       for="itxSenha"/>   
                        <p:inputText id="itxSenha"   
                                     value="#{clienteMB.cliente.senha}"   
                                     required="true"   
                                     requiredMessage="Informe a Senha"/>   
                    </h:panelGrid>   
                    <h:panelGrid columns="4" id="pnlSor">   
                        <h:outputLabel value="Enviar Sms?:"   
                                       for="sorEnviaSms" />   
                        <h:selectBooleanCheckbox  id="sorEnviaSms"   
                                                  value="#{clienteMB.cliente.enviaSms}"   
                                                  style="margin-right:50px"/>   
                        <h:outputLabel value="Enviar Email?:"   
                                       for="sorEnviaEmail" />   
                        <h:selectBooleanCheckbox  id="sorEnviaEmail"   
                                                  value="#{clienteMB.cliente.enviaEmail}"/>   
                    </h:panelGrid>   
                    <h:panelGrid columns="3" >   
                        <p:commandLink  id="clkGravar"   
                                        title="Gravar"   
                                        action="#{clienteMB.gravar}"   
                                        disabled="#{!empty clienteMB.cliente.id}"   
                                        style="margin-right:20px"   
                                        update="itxNome, mskCpf, itxEmail ,itxSenha, mskCelular, mskTelefone, cldDataNascimento, sorEnviaSms, sorEnviaEmail, frmGridCliente:dtClientes, frmGridCliente:menssagensCliente">   
                            <h:graphicImage url="/imagens/gravar.jpg"   
                                            style="border:0"/>   
                        </p:commandLink>   
                        <p:commandLink id="clkAlterar"   
                                       title="Alterar"   
                                       action="#{clienteMB.alterar}"   
                                       disabled="#{empty clienteMB.cliente.id}"   
                                       oncomplete="validarAlterar(xhr, status, args)"   
                                       update="itxNome, mskCpf, itxEmail ,itxSenha, mskCelular, mskTelefone, cldDataNascimento, sorEnviaSms, sorEnviaEmail, frmGridCliente, menssagensCliente"   
                                       style="margin-left:20px">   
  
                            <h:graphicImage url="/imagens/alterar.bmp"   
                                            style="border:0"/>   
  
                        </p:commandLink>   
                        <p:commandLink  id="clkCancelar"   
                                        title="Voltar"   
                                        style="margin-left:20px"   
                                        oncomplete="dlgCliente.hide();"   
                                        immediate="true">   
                            <h:graphicImage url="/imagens/voltar.jpg"   
                                            style="border:0"/>   
                        </p:commandLink>   
  
                    </h:panelGrid>   
                </p:dialog>   
            </h:form>   
        </h:body>   
    </f:view>   
</html>

Deste ja agradeço

43 Respostas

R

cara… primeiro… registrou o seu managed bean no faces config ? (se for jsf 1.2)

segundo : é totalmente errado usar o response.sendRedirect no seu mb, assim voce esta furando todo o ciclo de vida do jsf

o seu metodo voltar deve retornar uma string “voltar” e lá no faces config vc configura a navigation rule para quando o outcome for
voltar, ele mandar para a pagina desejada…

R

se você quer retornar uma String no método, coloque String na assinatura também…

public String voltar(){
    return "menu.xhtml";
}
J

o ideal seria vc mapear ele no faces e depois retornar na classe

<navigation-case>
	<from-outcome>voltar</from-outcome>
	<to-view-id>/pagina_anterior.jsp</to-view-id>
</navigation-case>
public String voltar(){  
    return "voltar";  
}
E

digaoneves

disculpa estava com return String. é que copiei errado mais o

public String voltar(){   
    return "menu.xhtml";   
}

gera o mesmo erro

E

"o ideal seria vc mapear ele no faces e depois retornar na classe "
fiz este mapeamento tbm da null pointer de cara na pagina nem chama o metodo

J

mas para ele dar nullpointer direto, alguma coisa ele ta chamando antes…
debuga ele ae, e posta o erro aqui

E

como eu te falei, ele não entra no metodo, isso testei com o debug , quando clico no commandLink ele não entra no voltar

J

cara, posso estar enganado, mas a estrutura de uma página web seria

<html>
	<body>
		<f:view>
			<h:form>
			</h:form>
		</f:view>
	</body>
</html>

pelo o que eu percebi no seu, vc está com a view antes do body…
não sei se isso acaba implicando…

E

Na verdade no JSF 2 não precisa do f:view, mais so pra desencargo de consciencia e mudei Jona, mesmo assim não deu certo =S

J

quando eu crio minhas páginas JSF, e adiciono algum componente com a tag ele reclama que não tem uma f:view…
então eu sempre coloco.
poste o erro aqui para poder dar uma olhada fazendo o favor

E
type Exception report

message 

description The server encountered an internal error () that prevented it from fulfilling this request.

exception 

javax.servlet.ServletException
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:422)
	org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)


root cause 

java.lang.NullPointerException
	org.primefaces.component.datatable.DataHelper.decodeFilters(DataHelper.java:182)
	org.primefaces.component.datatable.DataTableRenderer.decode(DataTableRenderer.java:47)
	javax.faces.component.UIComponentBase.decode(UIComponentBase.java:787)
	javax.faces.component.UIData.processDecodes(UIData.java:1162)
	org.primefaces.component.datatable.DataTable.processDecodes(DataTable.java:595)
	javax.faces.component.UIForm.processDecodes(UIForm.java:225)
	javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1176)
	javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1176)
	javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:933)
	com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:78)
	com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:409)
	org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)


note The full stack trace of the root cause is available in the Apache Tomcat/6.0.20 logs.
J

pode ser alguma configuração do faces…
e o triste é que não sou expert nesse assunto
=(

E

estranho ser alguma configuração, é apenas um voltar…

aonde eu posso encontrar ajuda em =s

J

uma pergunta, esse código aqui

<h:commandLink title="Voltar" action="#{clienteMB.voltar}" style="margin-left:20px">     
	<h:graphicImage url="/imagens/voltar.jpg" style="border:0"/>     
</h:commandLink>

é um link que dentro dele está tentando adicionar uma imagem ?
será que não pode ser isso?
sei la, tentar mudar esse link por um botão, pois dentro do botão tem uma opção imagem se não me engano, que da para vc adicionar uma imagem tmb…

E

isso todos botoes eu add img assim,tirei tbm nada,

e se eu mandar o projeto pra vc, ?

pode dar uma olhada?

J

posso tentar…
mas não garanto nada

R

Coloca aqui o código da classe do MB

E
@ManagedBean(name = "clienteMB")
@ViewScoped
public class ClienteMB implements Serializable {

    private static final long serialVersionUID = 1247727700035978352L;
    private PessoaBO clienteBO;
    private Pessoa cliente;
    private Pessoa clienteAntigo;
    private String senha;
    private List<Pessoa> clientes;
    private List<Ativo> ativos;

    // Construtor
    public ClienteMB() {
        Pessoa usuario = ((Pessoa) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario"));
        HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
        if (usuario == null || usuario.getPerfil().equals(Perfil.CLIENTE) || usuario.getAtivo().equals(Ativo.NAO)) {
            try {
                response.sendRedirect("acessoRestrito.xhtml");
            } catch (IOException ex) {
                JSFUtil.enviarMenssagemErro("Erro ao redirecionar");
            }
        }
        this.setAtivos(new ArrayList<Ativo>());
        this.getAtivos().add(Ativo.SIM);
        this.getAtivos().add(Ativo.NAO);
        this.setClienteBO(new PessoaBO());
        this.setCliente(new Pessoa());
        this.listar();
    }

    // Get e Set
    public PessoaBO getClienteBO() {
        return clienteBO;
    }

    public void setClienteBO(PessoaBO clienteBO) {
        this.clienteBO = clienteBO;
    }

    public Pessoa getCliente() {
        return cliente;
    }

    public void setCliente(Pessoa cliente) {
        this.cliente = cliente;
    }

    public Pessoa getClienteAntigo() {
        return clienteAntigo;
    }

    public void setClienteAntigo(Pessoa clienteAntigo) {
        this.clienteAntigo = clienteAntigo;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public List<Pessoa> getClientes() {
        return clientes;
    }

    public void setClientes(List<Pessoa> clientes) {
        this.clientes = clientes;
    }

    public List<Ativo> getAtivos() {
        return ativos;
    }

    public void setAtivos(List<Ativo> ativos) {
        this.ativos = ativos;
    }

    // Metodos
    public void incluir() {
        this.setCliente(new Pessoa());
        this.setSenha("");
    }

    public void selecionarCliente(SelectEvent evento) {
        this.setSenha(this.getCliente().getSenha());
        Pessoa cliente = new Pessoa();
        cliente.setId(this.getCliente().getId());
        cliente.setCpf(this.getCliente().getCpf());
        cliente.setEmail(this.getCliente().getEmail());
        cliente.setNome(this.getCliente().getNome());
        cliente.setPerfil(this.getCliente().getPerfil());
        cliente.setSenha(this.getCliente().getSenha());
        cliente.setCelular(this.getCliente().getCelular());
        cliente.setTelefone(this.getCliente().getTelefone());
        cliente.setAtivo(this.getCliente().getAtivo());
        cliente.setEnviaEmail(this.getCliente().getEnviaEmail());
        cliente.setEnviaSms(this.getCliente().getEnviaSms());
        cliente.setDataNascimento(this.getCliente().getDataNascimento());
        this.setClienteAntigo(cliente);
    }

    private Boolean validarClienteAlterar() {
        Boolean validacao = Boolean.TRUE;
        try {
            if (!CPFUtil.validarCPF(this.getCliente().getCpf())) {
                this.voltarClienteLista();
                JSFUtil.enviarMenssagemErro("Erro ao alterar : CPF inválido");
                validacao = Boolean.FALSE;
                return validacao;
            }
            if (!EmailUtil.validarEmail(this.getCliente().getEmail())) {
                this.voltarClienteLista();
                JSFUtil.enviarMenssagemErro("Erro ao alterar : Email inválido");
                validacao = Boolean.FALSE;
                return validacao;
            }
            if (!this.getClienteAntigo().getCpf().equals(this.getCliente().getCpf())) {
                if (!this.getClienteBO().validarCpfExistenteCliente(this.getCliente().getCpf())) {
                    this.voltarClienteLista();
                    JSFUtil.enviarMenssagemErro("Erro ao alterar : CPF ja cadastrado");
                    validacao = Boolean.FALSE;
                    return validacao;
                }
            }
            if (!this.getClienteAntigo().getEmail().equals(this.getCliente().getEmail())) {
                if (!this.getClienteBO().validarEmailExistenteCliente(this.getCliente().getEmail())) {
                    this.voltarClienteLista();
                    JSFUtil.enviarMenssagemErro("Erro ao alterar : Email ja cadastrado");
                    validacao = Boolean.FALSE;
                    return validacao;
                }
            }
            return validacao;
        } catch (Exception e) {
            e.printStackTrace();
            this.voltarClienteLista();
            JSFUtil.enviarMenssagemErro("Erro ao validar Usuario");
            this.setCliente(this.getClienteAntigo());
            validacao = Boolean.FALSE;
            return validacao;
        }
    }

    private void voltarClienteLista() {
        Integer indice = this.getClientes().indexOf(this.getClienteAntigo());
        this.getClientes().remove(this.getClienteAntigo());
        this.getClientes().add(indice, this.getClienteAntigo());
    }

    private Boolean validarClienteGravar() {
        Boolean validacao = Boolean.TRUE;
        try {
            if (!CPFUtil.validarCPF(this.getCliente().getCpf())) {
                JSFUtil.enviarMenssagemErro("Erro ao gravar : CPF inválido");
                validacao = Boolean.FALSE;
                return validacao;
            }
            if (!EmailUtil.validarEmail(this.getCliente().getEmail())) {
                JSFUtil.enviarMenssagemErro("Erro ao gravar : Email inválido");
                validacao = Boolean.FALSE;
                return validacao;
            }
            if (!this.getClienteBO().validarCpfExistenteCliente(this.getCliente().getCpf())) {
                JSFUtil.enviarMenssagemErro("Erro ao gravar : CPF ja cadastrado");
                validacao = Boolean.FALSE;
                return validacao;
            }
            if (!this.getClienteBO().validarEmailExistenteCliente(this.getCliente().getEmail())) {
                JSFUtil.enviarMenssagemErro("Erro ao gravar : Email ja cadastrado");
                validacao = Boolean.FALSE;
                return validacao;
            }
            return validacao;
        } catch (Exception e) {
            e.printStackTrace();
            JSFUtil.enviarMenssagemErro("Erro ao validar Usuario");
            validacao = Boolean.FALSE;
            return validacao;

        }
    }

    public void gravar() {
        this.getCliente().setCpf(CPFUtil.formatarCPF(this.getCliente().getCpf()));
        if (this.validarClienteGravar()) {
            try {
                this.getCliente().setAtivo(Ativo.SIM);
                this.getCliente().setPerfil(Perfil.CLIENTE);
                this.getClienteBO().gravar(this.getCliente());
                this.getClientes().add(this.getCliente());
                this.setCliente(new Pessoa());
                this.setSenha("");
                JSFUtil.enviarMenssagemSucesso("Cliente gravado com sucesso");
            } catch (Exception e) {
                e.printStackTrace();
                JSFUtil.enviarMenssagemErro("Erro ao gravar" + " " + e.getMessage());
            }
        }
    }

    public void alterar() {
        RequestContext.getCurrentInstance().addCallbackParam("alterou", false);
        this.getCliente().setCpf(CPFUtil.formatarCPF(this.getCliente().getCpf()));
        if (this.validarClienteAlterar()) {
            try {
                Integer indice = this.getClientes().indexOf(this.getCliente());
                this.getClienteBO().alterar(this.getCliente());
                this.getClientes().remove(this.getCliente());
                this.getClientes().add(indice, this.getCliente());
                RequestContext.getCurrentInstance().addCallbackParam("alterou", true);
                JSFUtil.enviarMenssagemSucesso("Cliente alterado com sucesso");
            } catch (Exception e) {
                this.voltarClienteLista();
                JSFUtil.enviarMenssagemErro("Erro ao alterar" + " " + e.getMessage());
            }

        }
    }

    public void validarApagar(ActionEvent event) {
        if (this.getCliente() == null || (this.getCliente() != null && this.getCliente().getEmail() == null)) {
            RequestContext.getCurrentInstance().addCallbackParam("isClienteSelecionado", false);
            JSFUtil.enviarMenssagemAtencao("Selecione um cliente na grid");
        } else {
            RequestContext.getCurrentInstance().addCallbackParam("isClienteSelecionado", true);
        }
    }

    public void apagar() {
        try {
            this.getClienteBO().apagar(this.getCliente());
            this.getClientes().remove(this.getCliente());
            JSFUtil.enviarMenssagemSucesso("Cliente apagado com sucesso");
        } catch (Exception e) {
            JSFUtil.enviarMenssagemErro("Erro ao apagar" + " "
                    + e.getMessage());
        }
    }

    public void listar() {
        try {
            this.setClientes(this.getClienteBO().listarClientes());
        } catch (Exception e) {
            e.printStackTrace();
            JSFUtil.enviarMenssagemErro("Erro ao listar" + " " + e.getMessage());
        }

    }

    public void voltar() {
        HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();
        try {
            response.sendRedirect("menu.xhtml");
        } catch (IOException ex) {
           JSFUtil.enviarMenssagemErro("Erro ao voltar");
        }
    }
}
E

pela exceção gerada, parece que tem algo have com o filtro do prime no web.xml

<filter>
        <filter-name>PrimeFaces FileUpload Filter</filter-name>
        <filter-class>org.primefaces.webapp.filter.FileUploadFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>PrimeFaces FileUpload Filter</filter-name>
        <servlet-name>Faces Servlet</servlet-name>
    </filter-mapping>

mais nao sei o que

E

?

E

Pessoal descobri que se eu tirar o paginator da minha tabela funciona =S

Nossa um coisa NADA VE , é o prime de muitos bugs =/

Mais não posso fazer isso…


Outra estou usando a versão 3.0 se eu mudar para 2.2.1 funciona, só que ai o file Upload não funciona mais

gostaria de manter a 3.0 e arrumar alguma forma de isso funcionar…

Alguem poderia me ajudar?

F

já tentou mudar o action

por actionListener?

E

JÁ tentei nao funcionou

F

bem uma vez eu tive esse problema ai só q era quando eu usava o <h:commandLink>

depois eu mudei para <p:commandLink> (Primefaces) e deu certo…

tenta também

E

ja testei com o Prime tambem e nada, o que é muito estranho se eu tirar o paginator das grids funciona normal

E

O prime é bom tem varios componentes e tals., mais tem muito bugs,ai temque perder um tempão tentando descubrir um solução

E

E

Pessoal Ninguem sabe? Algum moderador poderia me ajudar?

M

Amigo, primeiro: você está mexendo com JSF, esquece essa história de ServletResponse. Tire o JSP da sua mente, ok? Aqueles duros dias que você tinha que mexer nos bitzinhos manualmente já passaram (graças a Deus!). O jeito mais fácil (que é a própria proposta do JSF) é você esquecer essa coisa de response e request e usar as regras de navegação, ou então usar o próprio javascript para resolver o seu problema de voltar.

Minhas duas propostas:

1ª solução - regra de navegação:

<h:commandLink title="Voltar" action="#{clienteMB.voltar}" style="margin-left:20px">

Como você fez. Mas no clienteMB, escreva assim:

public String voltar() { return "menu" }

Então crie uma regra de navegação em seu faces-config.xhtml:

<navigation-rule> <from-view-id>/"a página que você está"</from-view-id> <navigation-case> <from-outcome>menu</from-outcome> <to-view-id>/"a página para onde você vai"</to-view-id> </navigation-case> </navigation-rule>

2ª solução - javascript:

<h:commandLink id="botao_voltar" onclick="javascript:history.go(-1)" value="Voltar" />
E

rsrs to ligado, apenas fiz isso para testar porque o

public String voltar() {       
     return "menu"     
} 
<navigation-rule>   
      <from-view-id>/"a página que você está"</from-view-id>   
      <navigation-case>   
       <from-outcome>menu</from-outcome>   
       <to-view-id>/"a página para onde você vai"</to-view-id>   
      </navigation-case>   
    </navigation-rule>

NÃO FUNCIONA

DA AQUELE ERRO…

Já o JavaScript

<h:commandLink id="botao_voltar" onclick="javascript:history.go(-1)" value="Voltar" />

vou testar, mais ele volta para pagina anterior certo? gostaria que ele voltasse para pagina principal “MENU”

Coisas estranhas…
1º)se eu tirar a tirar o paginator da DataTable ai funciona.
2º) Estou usando a versão 3 do PrimeFaces…se eu mudar para 2.2.1 tbm funciona só que na 2.2.1 o FileUpload não funciona… Então eu preciso manter a 3.0 e fazer funcionar

R

Em vez disso:

&lt;h:commandLink id="botao_voltar" onclick="javascript:history.go(-1)" value="Voltar" /&gt;

Faz assim:

&lt;h:commandLink id="botao_voltar" action="#{controller.voltar}" value="Voltar" /&gt;

e cria uma navigation rule pra voltar pra página que vc quer.

E

Pessoal, se vocês ver o tópico inteiro , eu ja fiz isso,

ALIAS isto foi a primeira coisa que eu fiz,esta gerando aquele exceção

J

Não sei c já resolveu o problema mas vou passar minha experiencia, também estou usando o Primefaces 3.0,
e tenho ciência que é uma versão inacabada, portanto é natural que encontremos alguns BUGs.

Eu passei por este problema e resolvi indo ao site do próprio PF. Se entrarmos no site do PrimeFaces em FAQ (http://www.primefaces.org/faq.html)
vai conferir no item 4 o porque do problema que vc está enfrentando:

Why navigations do not work with PrimeFaces commandButton and commandLink?
PrimeFaces does not support forward based navigations within an ajax request, you need to do redirect instead or set ajax to false.

Eu tenho usado a opção do ajax=false

Para ir direto a página chamo o nome da pagina sem a extensão direto no atributo action do p:command :

<p:commandButton action="nomeDaPaginaSemExtensao"  ajax="false" />

Já se houver necessidade de fazer mais alguma coisa alem de ir para alguma página eu aciono
o nome do método e no return do método eu aciono o nome da pagina sem a extensão:

<p:commandButton action="#{controller.irParaMenu}" ajax="false" />

controller

public String irParaMenu()
{
      (...faz as coisas a mais...)
      return "nomeDaPaginaSemExtensao";
}

É isso, espero ter ajudado.

M

Se o history.go(-1) não te atende, tente este:

<h:commandLink id="botao_voltar" onclick="javascript:document.location.href = 'página do seu menu.jsf'" value="Cancelar" />
E

achei alguem que sabe o que esta acontencedo…

sempre usei ajax false.

funciona mais para ir para a pagina de “MENU”
nem chega no metodo do MB, coloquei um breakPoint para testar.
MESMO COM AJAX FALSE gera aquela exceção.

Ja abri um post no site do prime até agora ninguem respondeu

na versão 2.2.1 funciona , só que ai o FileUpload ja eraa…preciso da 3.0

enquanto usar o java script do nossa amigo ai encima não consegui testar ainda…

J

Blz

Quanto a nem chegar ao MB, eu tb passei por isso, mas o meu erro era por não saber usar corretamente o action e actionListener da uma olhada neste post http://www.guj.com.br/java/86357-qual-a-diferenca-entre-action-e-actionlistener-no-jsf-

La explica direitinho quando usar um e outro, pode ser esse o motivo do seu commandbutton nem passar pelo MB,

Lembrei tb. do atributo immediate coloque ele como True, para que o JSF pule a fase de validação, pois pode ser que
ele esteja “enroscando” em alguma validação.

É isso, T+

E

To ligado a diferenças deles para redirecionar eu uso action

Em fim nada funcionou, nem o javaScrip nem colocando immediante true

contina gerando essa exceção

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:422)
	org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)

root cause

java.lang.NullPointerException
	org.primefaces.component.datatable.DataHelper.decodeFilters(DataHelper.java:182)
	org.primefaces.component.datatable.DataTableRenderer.decode(DataTableRenderer.java:47)
	javax.faces.component.UIComponentBase.decode(UIComponentBase.java:787)
	javax.faces.component.UIData.processDecodes(UIData.java:1162)
	org.primefaces.component.datatable.DataTable.processDecodes(DataTable.java:595)
	javax.faces.component.UIForm.processDecodes(UIForm.java:225)
	javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1176)
	javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1176)
	javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:933)
	com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:78)
	com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:409)
	org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.32 logs.

e pior não tenho mais aonde recorrer,o site do prime ninguem se manifesta

E

O que eu percebi é que quando eu iniciou a aplicação no console do tomcat gera a seguinte exceção,acho que tem algo haver

GRAVE: Servlet.service() for servlet Faces Servlet threw exception
java.lang.NullPointerException
	at org.primefaces.component.datatable.DataHelper.decodeFilters(DataHelper.java:182)
	at org.primefaces.component.datatable.DataTableRenderer.decode(DataTableRenderer.java:47)
	at javax.faces.component.UIComponentBase.decode(UIComponentBase.java:787)
	at javax.faces.component.UIData.processDecodes(UIData.java:1162)
	at org.primefaces.component.datatable.DataTable.processDecodes(DataTable.java:595)
	at javax.faces.component.UIForm.processDecodes(UIForm.java:225)
	at javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1176)
	at javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1176)
	at javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:933)
	at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:78)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:409)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
	at java.lang.Thread.run(Thread.java:662)
08/06/2011 18:31:28 org.apache.catalina.core.ApplicationContext log
INFO: SessionListener: contextDestroyed()
E

?

M

Cara, sem querer ser chato, mas você já olhou se seu Faces.Config não estaria setado para o JSF 1.2? Uma vez tive um trabalhão com esse nullPointerException, e depois de arrancar os cabelos tudo, o problema era só essa besteira aí: o Primefaces não funciona com JSF 1.2, só 2.0. Já o Richfaces é o contrário: ele costuma dar pau no 2.0 e funciona bem no 1.2

Olha a primeira linha do seu Faces.Config. Para o PrimeFaces funcionar, tem que estar assim:

<faces-config version="2.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd">

E

O meu é JSF 2…até porque o redirencionamento funciona em outras paginas , ele só não funciona quando vai redirecionar para a pagina “menu”…

Outra coisa estranha é aquele erro que da quando inicia a aplicação… o que pode ser?

J

Cara só para testar, isso c já não fez (rsrs), experimente colocar os managedbean com escopo de sessão
pois estou suspeitando que aquele erro de nullpointer quando ele ta tentando renderizar um datatable
pode ser que ele esteja perdendo alguma informação ao navegar entre as páginas.

E

Nada cara, acho que tem haver com o erro na hora de iniciar o tomcat que eu postei ali em cima

Criado 3 de junho de 2011
Ultima resposta 10 de jun. de 2011
Respostas 43
Participantes 8