JSF actionListener - aonde estou pecando?

10 respostas
contrabando

e ae galera na sussa?
nao consigo fazer meu botao ou link chamar o actionListener
AlunoList.jsp

<h:dataTable id="tabela" value="#{alunoBean.alunos}" var="aluno"  border="1"  cellpadding="1" cellspacing="1" >
	<!--Colunas com as propiedades dos alunos -->
	<h:column id="quatro"  >
		<f:facet name="header" ><h:outputText id="colEdit" value="Editar" /></f:facet>
		<h:commandButton id="bEdit" action="#{alunoBean.edicao}" value="Editar"  actionListener="#{alunoBean.selAluno}">
			<f:param name="codAluno" value="#{aluno.codigo}"/>
		</h:commandButton>
	</h:column>
</h:dataTable>

faces-config.xml

<!-- Navegação -->
<navigation-rule>
	<from-view-id>/paginas/AlunoList.jsp</from-view-id>
	<navigation-case>
		<from-outcome>inserir</from-outcome>
		<to-view-id>/paginas/Aluno.jsp</to-view-id>
	</navigation-case>
	<navigation-case>
		<from-action>#{alunoAction.edicao}</from-action>
		<from-outcome>sucesso</from-outcome>
		<to-view-id>/paginas/Aluno.jsp</to-view-id>
	</navigation-case>
</navigation-rule>
<!-- Bean -->
<managed-bean>
	<managed-bean-name>alunoBean</managed-bean-name>
	<managed-bean-class>br.com.luiz.facu.web.AlunoBean</managed-bean-class>
		<managed-bean-scope>session</managed-bean-scope>
</managed-bean>

br.com.luiz.facu.web.AlunoBean

public class AlunoBean {
//as propiedades do bean, seus gets e sets inclusive o List alunos
    public String edicao() {
        //algunas cositas
        return SUCESSO;
    }
    
    private void setAluno(Aluno aluno) {
        //seta as propiedades do aluno
    }
    
    public void selAluno(javax.faces.event.ActionEvent evento){
        UIParameter component = (UIParameter) evento.getComponent().findComponent("codAluno");
        Integer codigo = (Integer) component.getValue(); 
        setAluno(negocio.getAluno(codigo));
    }
}

apesar disto quando eu clico no botão “Editar” me retorna o seguinte erro:
log do jboss

09:46:18,978 ERROR [[Faces Servlet]] Servlet.service() for servlet Faces Servlet threw exception
javax.faces.el.EvaluationException: Exception while invoking expression #{alunoBean.selAluno}
at....
at....
at java.lang.Thread.run(Thread.java:595)
Caused by: java.lang.NoSuchMethodException: br.com.luiz.facu.web.AlunoBean.selAluno(javax.faces.event.ActionEvent)
	at java.lang.Class.getMethod(Class.java:1581)
	at org.apache.myfaces.el.MethodBindingImpl.invoke(MethodBindingImpl.java:118)
	... 25 more

qual erro estou cometendo? :roll:
desde já obrigado pela ajuda!

10 Respostas

Hempx

contrabando:
e ae galera na sussa?
nao consigo fazer meu botao ou link chamar o actionListener
AlunoList.jsp

<h:dataTable id="tabela" value="#{alunoBean.alunos}" var="aluno"  border="1"  cellpadding="1" cellspacing="1" >
	<!--Colunas com as propiedades dos alunos -->
	<h:column id="quatro"  >
		<f:facet name="header" ><h:outputText id="colEdit" value="Editar" /></f:facet>
		<h:commandButton id="bEdit" action="#{alunoBean.edicao}" value="Editar"  actionListener="#{alunoBean.selAluno}">
			<f:param name="codAluno" value="#{aluno.codigo}"/>
		</h:commandButton>
	</h:column>
</h:dataTable>

faces-config.xml

<!-- Navegação -->
<navigation-rule>
	<from-view-id>/paginas/AlunoList.jsp</from-view-id>
	<navigation-case>
		<from-outcome>inserir</from-outcome>
		<to-view-id>/paginas/Aluno.jsp</to-view-id>
	</navigation-case>
	<navigation-case>
		<from-action>#{alunoAction.edicao}</from-action>
		<from-outcome>sucesso</from-outcome>
		<to-view-id>/paginas/Aluno.jsp</to-view-id>
	</navigation-case>
</navigation-rule>
<!-- Bean -->
<managed-bean>
	<managed-bean-name>alunoBean</managed-bean-name>
	<managed-bean-class>br.com.luiz.facu.web.AlunoBean</managed-bean-class>
		<managed-bean-scope>session</managed-bean-scope>
</managed-bean>

br.com.luiz.facu.web.AlunoBean

public class AlunoBean {
//as propiedades do bean, seus gets e sets inclusive o List alunos
    public String edicao() {
        //algunas cositas
        return SUCESSO;
    }
    
    private void setAluno(Aluno aluno) {
        //seta as propiedades do aluno
    }
    
    public void selAluno(javax.faces.event.ActionEvent evento){
        UIParameter component = (UIParameter) evento.getComponent().findComponent("codAluno");
        Integer codigo = (Integer) component.getValue(); 
        setAluno(negocio.getAluno(codigo));
    }
}

apesar disto quando eu clico no botão “Editar” me retorna o seguinte erro:
log do jboss

09:46:18,978 ERROR [[Faces Servlet]] Servlet.service() for servlet Faces Servlet threw exception
javax.faces.el.EvaluationException: Exception while invoking expression #{alunoBean.selAluno}
at....
at....
at java.lang.Thread.run(Thread.java:595)
Caused by: java.lang.NoSuchMethodException: br.com.luiz.facu.web.AlunoBean.selAluno(javax.faces.event.ActionEvent)
	at java.lang.Class.getMethod(Class.java:1581)
	at org.apache.myfaces.el.MethodBindingImpl.invoke(MethodBindingImpl.java:118)
	... 25 more

qual erro estou cometendo? :roll:
desde já obrigado pela ajuda!

{alunoBean.selAluno} não seria setAluno

contrabando

não, repare que setAluno é um método privado
o selAluno é quem vai buscar(selecionar) o Aluno na camada de negócio e é ele que tem a assinatura(void metodo(ActionEvent e)) necesária

Paulo_Silveira

ta tudo certinho. restartou o tomcat? se esta gravando o estado no servidor as vezes ele pira, voce ja deve saber.

os erros classicos é receber ActionEvent do awt… e o seu ta certo.

o nome da classe ta certinha neh? br.com.luiz.facu.web.AlunoBean. bem, deve tar, senao a exception nao seria essa

contrabando

sei sim, só que eu uso jboss será que pode estar relacionado a isso?, e sim restartei o jboss.

também pensei nessa possibilidade tanto que na hora de postar tirei o import e coloquei o caminho inteiro no método

ta sim, como você mesmo mensionou já teria dado erro antes.

será que o JSF tem alguma peculiaridade pra se usar com jboss?

contrabando

Finalmente conseguí resolver o problema
Obrigado a todos(Paulo Silveira e Hempx) que tentaram ajudar.

o problema era esse mesmo, para as versões 4.0.3 e 4.0.4 do jboss que trabalha com o tomcat5.5 já tem algumas bibliotecas para jsf na pasta do tomcat no jboss(JBOSS_HOME/server/seu_home/deploy/jbossweb-tomcat55.sar/jsf-libs/).
Para resolver o problema tive que tirar essas bibliotecas do meu projeto(/WEB-INF/lib) e incluir as seguites linhas no web.xml

<listener>
    <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
  </listener>

se alguem tiver esse problema e mesmo fazendo o que eu disse acima não funcionar, tente baixar a versão mais recente do jsf e colocar na pasta do tomcat no jboss

urubatan

conflito de classpath
isto me lembra o DLL hell que era programar em delphi :smiley:

contrabando

contrabando:
jboss(JBOSS_HOME/server/seu_home/deploy/jbossweb-tomcat55.sar/jsf-libs/).
Para resolver o problema tive que tirar essas bibliotecas do meu projeto(/WEB-INF/lib)

ou então remover as libs que estão dentro do jsf-libs

arturberna

fiz uma coisa parecida essa, mas acontece nada e o log de erros nã da nenhum erro. Alguem tem idéia do que possa ser. Estou usando o Tomcat6.0

A

Olá arturberna,

Estou com o mesmo problema que você enfrentou com o JSF e Tomcat 6. Você conseguiu alguma solução?
No meu caso, a aplicação estava funcionando e do nada resolveu parar de funcionar.
Em alguns momentos, o listener funciona, em outros não.
Estou utilizando JSF 1.2, RichFaces e Facelets.

Abraço.

Andro Márcio.

filipenf

Aparentemente este problema está relacionado à falta do id para o param:

<f:param name="codAluno" value="#{aluno.codigo}"/>

Deveria ser:

<f:param id="codAluno" name="codAluno" value="#{aluno.codigo}"/>

Visto que o método findComponent procura pelo id e não pelo nome.

Criado 20 de julho de 2006
Ultima resposta 27 de mai. de 2009
Respostas 10
Participantes 7