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)