Erro no JSF - não encontra método

4 respostas
R

Tenho o seguinte trecho em uma página jsp

<h:outputLabel value="Descrição:"/>
            <h:panelGroup>
                <h:inputText id="descricao" size="40" maxlength="150" value="#{cadastroContaBean.contaEdicao.descricao }" label="Descrição" required="true"></h:inputText>
                <rich:suggestionbox for="descricao" suggestionAction="#{cadastroContaBean.sugerirDescricao }" width="230" height="120" var="item">
                    <h:column>
                        <h:outputText value="#{item }"/>
                    </h:column>
                </rich:suggestionbox>
                <h:message for="descricao" showSummary="true" showDetail="false" styleClass="msgErro"></h:message>
            </h:panelGroup>

Quando o métdo sugerirDescricao da managed bean CadastroContaBean é chamado aparece o seguinte erro

GRAVE: Servlet.service() for servlet [Faces Servlet] in context with path [/Financeiro] threw exception [/contas/cadastroConta.jsp(49,4) ‘#{cadastroContaBean.sugerirDescricao }’ Method not found: [email removido](java.lang.Object)] with root cause
org.apache.jasper.el.JspMethodNotFoundException: /contas/cadastroConta.jsp(49,4) ‘#{cadastroContaBean.sugerirDescricao }’ Method not found: [email removido](java.lang.Object)

Ou seja, diz que meu método não foi encontrado, porém ele está lá. Vou mostrar meus códigos completos:

cadastroConta.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="f"  uri="http://java.sun.com/jsf/core"%>
<%@ taglib prefix="h"  uri="http://java.sun.com/jsf/html"%>
<%@ 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=ISO-8859-1">
<title>Cadastro de conta</title>
<link rel="stylesheet" type="text/css" href="../css/estilo.css"/>
</head>
<body>
<f:view>
    <h:form id="frm">
        <h1><h:outputText value="Cadastro de conta"/></h1>
       
        <h:messages layout="table" showSummary="true"
            showDetail="false" globalOnly="true"
            styleClass="msgErro" infoClass="msgInfo"
            style="font-weight: bold"/>
       
        <h:panelGrid columns="2">
            <h:outputLabel value="Código:" rendered="#{cadastroContaBean.contaEdicao.id != null }"></h:outputLabel>
            <h:panelGroup rendered="#{cadastroContaBean.contaEdicao.id != null }">
                <h:inputText id="codigo" size="10" value="#{cadastroContaBean.contaEdicao.id }" label="Código da conta" disabled="true"/>
                <h:message for="codigo" showSummary="true" showDetail="false" styleClass="msgErro"/>
            </h:panelGroup>
           
            <h:outputLabel value="Pessoa:"/>
            <h:panelGroup>
                <h:selectOneMenu id="pessoa" value="#{cadastroContaBean.contaEdicao.pessoa }" label="Pessoa" required="true">
                    <f:selectItems value="#{cadastroContaBean.pessoas }"/>
                </h:selectOneMenu>
                <h:message for="pessoa" showSummary="true" showDetail="false" styleClass="msgErro"/>   
            </h:panelGroup>
           
            <h:outputLabel value="Tipo:"/>
            <h:panelGroup>
                <h:selectOneRadio id="tipo" value="#{cadastroContaBean.contaEdicao.tipo }" label="Tipo da Conta" required="true">
                    <f:selectItems value="#{cadastroContaBean.tiposLancamentos }"/>
                </h:selectOneRadio>
                <h:message for="tipo" showSummary="true" showDetail="false" styleClass="msgErro"></h:message>
            </h:panelGroup>
           
           [b] <h:outputLabel value="Descrição:"/>
            <h:panelGroup>
                <h:inputText id="descricao" size="40" maxlength="150" value="#{cadastroContaBean.contaEdicao.descricao }" label="Descrição" required="true"></h:inputText>
                <rich:suggestionbox for="descricao" suggestionAction="#{cadastroContaBean.sugerirDescricao }" width="230" height="120" var="item">
                    <h:column>
                        <h:outputText value="#{item }"/>
                    </h:column>
                </rich:suggestionbox>
                <h:message for="descricao" showSummary="true" showDetail="false" styleClass="msgErro"></h:message>
            </h:panelGroup>[/b]
           
            <h:outputLabel value="Valor:"/>
            <h:panelGroup>
                <h:inputText id="valor" size="12" maxlength="10" value="#{cadastroContaBean.contaEdicao.valor }" label="Valor" required="true">
                    <f:convertNumber minFractionDigits="2"/>
                </h:inputText>
                <h:message for="valor" showSummary="true" showDetail="false" styleClass="msgErro" ></h:message>
            </h:panelGroup>
           
            <h:outputLabel value="Data vencimento:"/>
            <h:panelGroup>
                <rich:calendar id="dataVencimento" inputSize="12" value="#{cadastroContaBean.contaEdicao.dataVencimento }" label="Data Vencimento" required="true" datePattern="dd/MM/yyyy" enableManualInput="true" />
                <h:message for="dataVencimento" showSummary="true" showDetail="false" styleClass="msgErro"></h:message>
            </h:panelGroup>
           
            <h:outputLabel value="Data baixa:"/>
            <h:panelGroup>
                <rich:calendar id="dataBaixa" inputSize="12" value="#{cadastroContaBean.contaEdicao.dataBaixa }" label="Data Baixa" required="false" datePattern="dd/MM/yyyy" enableManualInput="true" />
                <h:message for="dataBaixa" showSummary="true" showDetail="false" styleClass="msgErro"></h:message>
            </h:panelGroup>
           
            <h:panelGroup>
                <a4j:commandButton value="Salvar" actionListener="#{cadastroContaBean.salvar }" reRender="frm" type="submit"/>
                <h:commandButton value="Cancelar" action="menu" immediate="true"></h:commandButton>
            </h:panelGroup>
        </h:panelGrid>
    </h:form>
</f:view>
</body>
</html>

CadastroContaBean.java

package com.algaworks.dwjsf.financeiro.visao;

import java.util.ArrayList;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;

import com.algaworks.dwjsf.financeiro.dominio.Conta;
import com.algaworks.dwjsf.financeiro.dominio.Pessoa;
import com.algaworks.dwjsf.financeiro.dominio.TipoConta;
import com.algaworks.dwjsf.financeiro.negocio.ContaService;
import com.algaworks.dwjsf.financeiro.negocio.PessoaService;
import com.algaworks.dwjsf.financeiro.negocio.RegraNegocioException;

public class CadastroContaBean {

    private Conta contaEdicao;
    private List<SelectItem> tiposContas;
    private List<SelectItem> pessoas;
   
    public String inicializar(){
        this.contaEdicao = new Conta();
        this.tiposContas = null;
        this.pessoas = null;
        System.out.println("1");
        return "cadastroConta";
    }
   
    public void salvar(ActionEvent event){
        FacesContext context = FacesContext.getCurrentInstance();
        try{
            new ContaService().salvar(this.contaEdicao);
            this.contaEdicao = new Conta();
            FacesMessage msg = new FacesMessage("Conta salva com sucesso!");
            msg.setSeverity(FacesMessage.SEVERITY_INFO);
            context.addMessage(null, msg);
        }
        catch(RegraNegocioException e){
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage()));
        }
        catch(Exception e){
            e.printStackTrace();
            FacesMessage msg = new FacesMessage("Erro inesperado ao salvar conta!");
            msg.setSeverity(FacesMessage.SEVERITY_ERROR);
            context.addMessage(null, msg);
        }
    }
   
    public List<SelectItem> getPessoas(){
        if(this.pessoas == null){
            this.pessoas = new ArrayList<SelectItem>();
            List<Pessoa> pessoas = new PessoaService().listarTodas();
            this.pessoas.add(new SelectItem(null, "Selecione"));
            for(Pessoa pessoa: pessoas){
                this.pessoas.add(new SelectItem(pessoa, pessoa.getNome()));
            }
        }
        return this.pessoas;
    }
   
    public List<SelectItem> getTiposLancamentos(){
        if(this.tiposContas == null){
            this.tiposContas = new ArrayList<SelectItem>();
            for(TipoConta tipo: TipoConta.values()){
                this.tiposContas.add(new SelectItem(tipo, tipo.toString()));
            }
        }
        return tiposContas;
    }
   
    [b]public List<String> sugerirDescricao(Object event){
        return new ContaService().pesquisarDescricoes(event.toString());
    }[/b]

    public Conta getContaEdicao() {
        return contaEdicao;
    }

    public void setContaEdicao(Conta contaEdicao) {
        this.contaEdicao = contaEdicao;
    }
}

faces-config.xml

<?xml version="1.0" encoding="UTF-8"?>

<faces-config
    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"
    version="2.0">
   
    <application>
        <message-bundle>
            com.algaworks.dwjsf.financeiro.recursos.messages
        </message-bundle>
    </application>
   
    <application>
          <view-handler>org.ajax4jsf.application.AjaxViewHandler</view-handler>
    </application>
   
    [b]<managed-bean>
        <managed-bean-name>cadastroContaBean</managed-bean-name>
        <managed-bean-class>com.algaworks.dwjsf.financeiro.visao.CadastroContaBean</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>[/b]
   
    <managed-bean>
        <managed-bean-name>consultaContaBean</managed-bean-name>
        <managed-bean-class>com.algaworks.dwjsf.financeiro.visao.ConsultaContaBean</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>
    </managed-bean>
   
    <managed-bean>
        <managed-bean-name>helloRichBean</managed-bean-name>
        <managed-bean-class>com.algaworks.dwjsf.financeiro.visao.HelloRichBean</managed-bean-class>
        <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
   
    <navigation-rule>
        <navigation-case>
            <from-outcome>cadastroConta</from-outcome>
            <to-view-id>/contas/cadastroConta.jsp</to-view-id>
        </navigation-case>
        <navigation-case>
            <from-outcome>consultaConta</from-outcome>
            <to-view-id>/contas/consultaConta.jsp</to-view-id>
        </navigation-case>
    </navigation-rule>
   
    <navigation-rule>
        <navigation-case>
            <from-outcome>menu</from-outcome>
            <to-view-id>/menu.jsp</to-view-id>
            <redirect/>
        </navigation-case>
    </navigation-rule>
   
    <converter>
        <converter-for-class>java.lang.Enum</converter-for-class>
        <converter-class>com.algaworks.dwjsf.financeiro.conversores.EnumConverter</converter-class>
    </converter>
   
    <converter>
        <converter-for-class>com.algaworks.dwjsf.financeiro.dominio.Pessoa</converter-for-class>
        <converter-class>com.algaworks.dwjsf.financeiro.conversores.PessoaConverter</converter-class>
    </converter>

</faces-config>

ContaService.java

package com.algaworks.dwjsf.financeiro.negocio;

import java.math.BigDecimal;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;

import com.algaworks.dwjsf.financeiro.dominio.Conta;
import com.algaworks.dwjsf.financeiro.util.HibernateUtil;

public class ContaService {
   
    public void salvar(Conta conta) throws RegraNegocioException{
    if(conta.getValor().compareTo(BigDecimal.ZERO) <= 0){
        throw new RegraNegocioException("Valor da conta deve ser maior que zero.");
    }
   
    Session session = HibernateUtil.getSession();
    Transaction tx = session.beginTransaction();
   
    session.saveOrUpdate(conta);
   
    tx.commit();
    session.close();
    }
   
    public Conta pesquisarPorId(Long id){
        Session session = HibernateUtil.getSession();
        try{
            return(Conta) session.get(Conta.class, id);
        }
        finally{
            session.close();
        }
    }
   
    @SuppressWarnings("unchecked")
    public List<Conta> listarTodas(){
        Session session = HibernateUtil.getSession();
        try{
            return session.createCriteria(Conta.class).addOrder(Order.desc("dataVencimento")).list();
        }
        finally{
            session.close();
        }
    }
   
    public void excluir(Conta conta) throws RegraNegocioException{
        if(conta.getDataBaixa() != null){
            throw new RegraNegocioException("Esta conta não pode ser excluída, pois já foi baixada");
        }
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
       
        session.delete(conta);
       
        tx.commit();
        session.close();
    }
   

   [b] @SuppressWarnings("unchecked")
    public List<String> pesquisarDescricoes(String descricao){
        Session session = HibernateUtil.getSession();
        try{
            return session.createCriteria(Conta.class).setProjection(Projections.distinct(Projections.property("descricao"))).add(Restrictions.ilike("descricao", descricao, MatchMode.ANYWHERE)).addOrder(Order.asc("descricao")).list();
        }
        finally{
            session.close();
        }
    }[/b]
}

log completo do erro

GRAVE: Servlet.service() for servlet [Faces Servlet] in context with path [/Financeiro] threw exception [/contas/cadastroConta.jsp(49,4) ‘#{cadastroContaBean.sugerirDescricao } Method not found: [email removido](java.lang.Object)] with root cause

org.apache.jasper.el.JspMethodNotFoundException: /contas/cadastroConta.jsp(49,4) ‘#{cadastroContaBean.sugerirDescricao } Method not found: [email removido](java.lang.Object)

at org.apache.jasper.el.JspMethodExpression.invoke(JspMethodExpression.java:73)

at org.richfaces.component.UISuggestionBox.setupValue(UISuggestionBox.java:492)

at org.richfaces.component.UISuggestionBox.broadcast(UISuggestionBox.java:424)

at javax.faces.component.UIData.broadcast(UIData.java:1093)

at org.richfaces.component.UISuggestionBox.broadcast(UISuggestionBox.java:421)

at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:329)

at org.ajax4jsf.component.AjaxViewRoot.broadcastAjaxEvents(AjaxViewRoot.java:348)

at org.ajax4jsf.application.AjaxViewHandler.processAjaxEvents(AjaxViewHandler.java:216)

at org.ajax4jsf.application.AjaxViewHandler.renderView(AjaxViewHandler.java:169)

at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)

at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)

at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)

at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)

at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206)

at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)

at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)

at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164)

at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)

at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:563)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:403)

at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:301)

at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:162)

at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)

at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)

at java.lang.Thread.run(Unknown Source)

4 Respostas

D

acho que métodos em JSF tem que por o get e o set na frente

exemplo: getSugerirDescricao

R

duducordeiro_:
acho que métodos em JSF tem que por o get e o set na frente

exemplo: getSugerirDescricao

Isso que vc tá falando é outra coisa. Todos os meus outros métodos estão funcionando normalmente(não possuem get ou set), apenas quando chama o método que eu citei é que dá o erro.

D

chegasse a tentar?

R

Criado 26 de julho de 2011
Ultima resposta 27 de jul. de 2011
Respostas 4
Participantes 2