JSF: Command Button não chama o metodo [RESOLVIDO]

13 respostas
R

Gente, estou aprendendo JSF (estou usando jsf + richfaces) e to com um problema num command button que eu coloquei em um formulario

quando eu clico no botao para executar a acao ele simplesmente nem entra no metodo que deveria … o bean jah esta mapeado corretamente porque, no forumalario existem 3 combos que estao sendo preenchidos com metodos do bean

vou colocar os codigos aqui, quem sabe alguem possa me ajudar:

JSP

<%-- 
    Document   : novoPlanejamento
    Created on : 03/10/2008, 15:26:55
    Author     : bernardo
--%>

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>

<%@taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@taglib uri="http://richfaces.org/a4j" prefix="a4j"%>
<%@taglib uri="http://richfaces.org/rich" prefix="rich"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <title>Novo Planejamento</title>
        
        <link href="/sdp/css/default.css" type="text/css" rel="stylesheet" />
    </head>
    <body>
        <f:view>
            <%@ include file="../menu.jsp"%>
            <h:form id="novoPlanejamentoForm">
                <rich:panel>
                    <f:facet name="header">
                        <h:outputText value="Novo Planejamento Mensal" />
                    </f:facet>
                    <h:panelGrid columns="2" cellpadding="2" cellspacing="2" >
                        <h:outputText styleClass="formFonte1"  value="Mês: " />
                        <rich:inplaceSelect id="mesPlanejamento" required="true"
                                            value="#{NovoPlanejamentoMB.mesPlanejamento}"
                                            defaultLabel="Clique aqui e selecione">
                            <f:selectItems value="#{NovoPlanejamentoMB.listaMeses}" />
                        </rich:inplaceSelect>
                        
                        <h:outputText styleClass="formFonte1"  value="Ano: " />
                        <rich:inplaceSelect id="anoPlanejamento" required="true"
                                            value="#{NovoPlanejamentoMB.anoPlanejamento}"
                                            defaultLabel="Clique aqui e selecione">
                            <f:selectItems value="#{NovoPlanejamentoMB.listaAnos}" />
                        </rich:inplaceSelect>
                        
                        <h:outputText styleClass="formFonte1"  value="Setor: " />
                        
                        <rich:inplaceSelect id="setorPlanejamento" required="true"
                                            value="#{NovoPlanejamentoMB.setorPlanejamento}"
                                            defaultLabel="Clique aqui e selecione"
                                            listWidth="450">
                            <f:selectItems value="#{NovoPlanejamentoMB.listaSetores}" />
                        </rich:inplaceSelect>
                    </h:panelGrid>
                    <rich:spacer height="20" />
                    <h:commandButton value="Salvar" action="#{NovoPlanejamentoMB.cadastrarPlanejamento}" />
                </rich:panel>
            </h:form>
            <%@ include file="../rodape.jsp"%>
        </f:view>
    </body>
</html>

BEAN

/**
 *
 * @author bernardo
 */
public class NovoPlanejamentoMB extends GenericMB {

    private Logger logger = Logger.getLogger(NovoPlanejamentoMB.class);
    
    private PlanejamentoService planejamentoService;
    private Planejamento planejamento;
    
    private SetorDiariaService setorDiariaService;
    private SetorDiaria setorDiaria;
    
    //Variáveis do formulário
    private Long mesPlanejamento;
    private Long anoPlanejamento;
    private Long setorPlanejamento;

    public String carregarPagina() {
        try {
            popularComboMes();
            popularComboAno();
            popularComboSetor();
        } catch (DAOException ex) {
            logger.error(ex);
            ex.printStackTrace();
        }
        return "CRIA_PLANEJAMENTO";
    }
    
    // Método para cadastrar planejamento
    public String cadastrarPlanejamento() {
        logger.info("TESTE");
        try {
            planejamentoService = new PlanejamentoService();
            planejamento = new Planejamento();

            setorDiariaService = new SetorDiariaService();
            setorDiaria = setorDiariaService.retornarSetorDiaria(SetorDiaria.class, setorPlanejamento);

            planejamento.setNumMesPlanejamentoPla(mesPlanejamento);
            planejamento.setNumAnoPlanejamentoPla(anoPlanejamento);
            planejamento.setDscPeriodoPlanejamentoPla(mesPlanejamento + "/" + anoPlanejamento);
            planejamento.setDatCriacaoPlanejamentoPla(Calendar.getInstance().getTime());
            planejamento.setFkSeqSetorDiariaSdi(setorDiaria);


            planejamentoService.criarPlanejamento(planejamento);
            JSFHelper.addGlobalMessage("Planejamento cadastrado com sucesso");
            return "SUCESSO";
        } catch (Exception ex) {
            logger.error(ex);
            ex.printStackTrace();
            JSFHelper.addGlobalMessage(ex.getMessage());
            return "ERRO";
        }
    }

    // Método para atualizar planejamento
    public String atualizarPlanejamento() {
        planejamentoService = new PlanejamentoService();
        planejamento = new Planejamento();
        try {
            planejamentoService.atualizarPlanejamento(planejamento);
            JSFHelper.addGlobalMessage("Planejamento atualizado com sucesso");
            return "SUCESSO";
        } catch (Exception ex) {
            logger.error(ex);
            ex.printStackTrace();
            JSFHelper.addGlobalMessage(ex.getMessage());
            return "ERRO";
        }
    }

    // Método para excluir planejamento
    public String excluirImovel() {
         planejamentoService = new PlanejamentoService();
        planejamento = new Planejamento();
        try {
            planejamentoService.excluirPlanejamento(planejamento);
            JSFHelper.addGlobalMessage("Planejamento excluído com sucesso");
            planejamento = new Planejamento();
            return "SUCESSO";
        } catch (Exception ex) {
            planejamento = new Planejamento();
            logger.error(ex);
            ex.printStackTrace();
            JSFHelper.addGlobalMessage(ex.getMessage());
            return "ERRO";
        }
    }

    //GETS E SETS AQUI
}

o programa nao chega nem a entrar no metodo, quando eu clico no botao ele simplesmente recarrega a pagina … no logger da aplicacao ele esta simplesmente executando o filtro que eu coloquei quando ele entra em alguma pagina … alguem jah passou por isso?

[]'s

13 Respostas

R

soh uma coisa:
eu jah tentei fazer usando no command button actionListener="" ao invez do action="" e no metodo do bean passar um ActionEvent. Nao funcionou tambem.

F

rollei blz cara?
No console não da nenhuma exception nada?
Como esta seu faces-config?, configurou seu bean direitinho?, do jeito que você postou o código seu faces deveria estar ± assim:

&lt;managed-bean&gt;
  &lt;managed-bean-name&gt;NovoPlanejamentoMB&lt;/managed-bean-name&gt;
  &lt;managed-bean-class&gt;seus.pacotes.NovoPlanejamentoMB&lt;/managed-bean-class&gt;
  &lt;managed-bean-scope&gt;session&lt;/managed-bean-scope&gt;
&lt;/managed-bean&gt;

o “managed-bean-scope” não precisar ser session tá, foi só exemplo mesmo.
Desculpa se falei alguma besteira, vai postando aí que eu ti ajudo na medida do possível.

Abraços,

R

cara meu faces ta assim:

<!-- Managed Beans -->
    <managed-bean>
        <managed-bean-name>NovoPlanejamentoMB</managed-bean-name>
        <managed-bean-class>
            pacotes.NovoPlanejamentoMB
        </managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>

no console nenhuma excecao. ta soh mostrando o debug do hibernate, mostrando os selects dos combos e uma mensagem dizendo que o filtro foi executado (eh soh um filtro que verifica se o usuario esta logado antes de entrar nas paginas). Nenhum erro ou excecao

o bean esta mapeado correto, porque os metodos que preenchem os combos do formulario estao funcionando

F

Que estranho cara, do jeito que postou deveria funcionar, não vejo mais nenhum empecilho…o commandButton deveria acessar o método…vou ver algo por aqui e posto mais alguma coisa se conseguir.

abraços,

K

Cara, não vi nenhum problema!

Uma vez tive um problema parecido é era por causa da conversão de tipos dos dados do formulário.Pelo que vi, vc está populando combos com mes, ano e dia né!? O registros selecionados vc está armazenando em variáveis do tipo Long.Possivelmente vc está populando usando SelectItem certo!? Veja se quando vc cria os objetos SelectItem vc está fazendo assim:

SelectItem item = new SelectItem( mes.getIdMes.longValue( ), mes.getDescricao( ) );

Repare no longValue() para recupera o valor do id do mês.Tive problemas quando fiz diferente, quando simplesmente chavama mes.getIdMes().

Não tenho certeza do motivo, mas quando mudei colocando o longValue(), consegui passar pela conversão e chamar o método.

Boa sorte!

F

Boa Kain_Paladian pode ser isso mesmo!, mas deveria dar um warning no console pelo menos né?

rollei cria uma página de teste a parte com um inputText apenas e tenta chamar um método do bean da mesma forma, se funcionar pode ser problema com a conversão dos combos mesmo.

R

Kain_Paladian:
Cara, não vi nenhum problema!

Uma vez tive um problema parecido é era por causa da conversão de tipos dos dados do formulário.Pelo que vi, vc está populando combos com mes, ano e dia né!? O registros selecionados vc está armazenando em variáveis do tipo Long.Possivelmente vc está populando usando SelectItem certo!? Veja se quando vc cria os objetos SelectItem vc está fazendo assim:

SelectItem item = new SelectItem( mes.getIdMes.longValue( ), mes.getDescricao( ) );

Repare no longValue() para recupera o valor do id do mês.Tive problemas quando fiz diferente, quando simplesmente chavama mes.getIdMes().

Não tenho certeza do motivo, mas quando mudei colocando o longValue(), consegui passar pela conversão e chamar o método.

Boa sorte!

cara … funcionou …

valeu mesmo. Agora fiquei revoltado >< … como que o conversor do componente do RichFaces nao jogou nenhuma excecao? brigadao

K

Maravilha cara…

Pois é, também fiquei revoltado por não apresentar nenhum erro.Pelo que parece, essa conversão é feita de primitivo para wrapper.Mas não encontrei nenhuma referência que explique isso…Se alguém sabe o motivo, passa ai para a galera…

:smiley:

I

E aí pessoal, blz?

Tô ressucitando esse forum…

Seguinte, to tendo o mesmo problema que o rollei, mas o meu ta retornando um erro: MethodNotFoundException.

Meu bean tbm tá bem mapeado, pq recupero as variáveis dele. E analizando a resolução deste forum, não encontrei semelhança com o meu problema.

Se vcs puderem me dar uma forcinha tbm… hehe

Vlw pessoal!

F

Fala igorbrites,

Cara posta seu commandButton com a chamada do método e o método do seu managed-bean.

Abraços,

V

Hehehe! Eu também estou com o problema de MethodNotFoundException. Se alguém puder dar uma luz, agradeço!

I

Fala pessoal! Desculpa na demora da postagem (tava agarrado em outras coisas aki)!

Mas é o seguinte, eu num tava conseguindo recuperar o método na chamada do commandButton. Agora eu consigo, mas ele não recupera os valores dos campos! Tá dando o FDP do NullpointerException!

Os códigos:

O método:

public String executarLogon(){
	if(logon.getLogin() != null){ // private LogonBean logon;
		EntityManager em = getEntityManager();
		query = em.createNamedQuery("CadastroCliente.Logon");
		query.setParameter("login", logon.getLogin());
		query.setParameter("senha", logon.getSenha());
		if(query.getResultList() != null){
			return "sucesso";
		}else{
			return "falha";
		}
	}
	return "falha";
}

Classe LogonBean:

public class LogonBean extends LogonImplm{
	private LogonImplm logon;
	private String login;
	private String senha;
	
	public LogonBean(){
		
	}
	
	public String getLogin() {
		if(this.login != null){
			return login;
		}
		return null;
	}

	public void setLogin(String login) {
		this.login = login;
	}

	public String getSenha() {
		if(this.senha != null){
			return senha;
		}
		return null;
	}

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

	public LogonImplm getLogon() {
		return logon;
	}

	public void setLogon(LogonImplm logon) {
		this.logon = logon;
	}

}

Classe LogonImplm (gerado pelo NetBeans):

@Stateless
public class LogonImplm implements Logon {
	
	public void clear() {
		// TODO Auto-generated method stub
	}

	public void close() {
		// TODO Auto-generated method stub
		
	}

	public boolean contains(Object arg0) {
		// TODO Auto-generated method stub
		return false;
	}

	public Query createNamedQuery(String q) {
		return null;
	}

	public Query createNativeQuery(String arg0) {
		// TODO Auto-generated method stub
		return null;
	}

	public Query createNativeQuery(String arg0, Class arg1) {
		return null;
	}

	public Query createNativeQuery(String arg0, String arg1) {
		// TODO Auto-generated method stub
		return null;
	}

	public Query createQuery(String arg0) {
		// TODO Auto-generated method stub
		return null;
	}

	public <T> T find(Class<T> arg0, Object arg1) {
		return (T) arg1;
	}

	public void flush() {
		// TODO Auto-generated method stub
		
	}

	public Object getDelegate() {
		// TODO Auto-generated method stub
		return null;
	}

	public FlushModeType getFlushMode() {
		// TODO Auto-generated method stub
		return null;
	}

	public <T> T getReference(Class<T> arg0, Object arg1) {
		// TODO Auto-generated method stub
		return null;
	}

	public EntityTransaction getTransaction() {
		// TODO Auto-generated method stub
		return null;
	}

	public boolean isOpen() {
		// TODO Auto-generated method stub
		return false;
	}

	public void joinTransaction() {
		// TODO Auto-generated method stub
		
	}

	public void lock(Object arg0, LockModeType arg1) {
		// TODO Auto-generated method stub
		
	}

	public <T> T merge(T arg0) {
		// TODO Auto-generated method stub
		return null;
	}

	public void persist(Object arg0) {
		// TODO Auto-generated method stub
		
	}

	public void refresh(Object arg0) {
		// TODO Auto-generated method stub
		
	}

	public void remove(Object arg0) {
		// TODO Auto-generated method stub
		
	}

	public void setFlushMode(FlushModeType arg0) {
		// TODO Auto-generated method stub
		
	}

}

O erro:

15:16:34,218 FATAL [application] java.lang.NullPointerException
javax.faces.el.EvaluationException: java.lang.NullPointerException
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:91)
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:91)
	at javax.faces.component.UICommand.broadcast(UICommand.java:383)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:447)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:752)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
	at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:687)
	at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:590)
	at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:505)
	at org.apache.jasper.runtime.JspRuntimeLibrary.include(JspRuntimeLibrary.java:968)
	at org.apache.jsp.index_jsp._jspService(index_jsp.java:53)
	at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:387)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
	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:230)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179)
	at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
	at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:241)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:580)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
	at com.br.jrfp.services.SucessoLogonMB.executarLogon(SucessoLogonMB.java:18)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at org.apache.el.parser.AstValue.invoke(AstValue.java:131)
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
	at com.sun.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:68)
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:77)
	... 39 more

Bom acho q é só isso (como se fosse pouco!!! rsrsrsr)

Se isso não for suficiente, vcs me falam!

Vlw pessoal!

V

Boa tarde Igor!

Dá uma olhada nas linhas 43 e 44 dos seus erros!

Geralmente NullPointerException acontece por causa de algum erro de programação mesmo como tentar colocar algo dentro de um objeto (tipo Lista, sei lá) não inicializado, ou que retorna algum Null entende?!

Dá uma olhada no seu código para ver se não encontrar o ponto do NullPointer dentro do código. O Eclipse dá suporte para isso! O Netbeans eu não sei!

Flws!

Criado 13 de outubro de 2008
Ultima resposta 15 de jun. de 2009
Respostas 13
Participantes 5