Método Procura - The Method is not applicable for the arguments

9 respostas
T

Pessoal,
Estou fazendo uma aplicação que precisa pesquisar o endereço a partir de um CEP fornecido pelo usuário. Estou utilizando Jsp, JDBC, Mysql e Access( base de ceps ). O problema é que não consigo utilizar o método procura CEP que possuo, pois aparece a mensagem abaixo:

java.lang.Error: Unresolved compilation problem: 
	The method procura(String) in the type CepDAO is not applicable for the arguments (Cep)

	br.com.pizza.mvc.ProcuraCepLogic.execute(ProcuraCepLogic.java:21)
	br.com.pizza.mvc.ControllerServlet.service(ControllerServlet.java:29)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

Está é um trecho da classe de Modelo para o CEP:

package br.com.pizza.jdbc.modelo;

public class Cep {
	
	private String cep;
	private String tipo;
	private String bairro;
	private String nome;
	
	public String getCep() {
		return cep;
	}
	public void setCep(String cep) {
		this.cep = cep;
	}

Eis o meu método do meu DAO que deveria procurar o CEP:

public Cep procura(String cep) throws SQLException {
		PreparedStatement stmt = connection.prepareStatement("select * from Cep where cep=?");
		stmt.setString(1, cep);
		ResultSet rs = stmt.executeQuery();
		
		if(!rs.next()) return null;
		
		Cep c = new Cep();
		c.setCep(rs.getString("cep"));
		c.setTipo(rs.getString("tipo"));
		c.setNome(rs.getString("nome"));
		c.setBairro(rs.getString("bairro"));
		
		rs.close();
		stmt.close();
		return c; 
	}

E este é a classe Logic que utiliza o método procura:

package br.com.pizza.mvc;

import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import br.com.pizza.jdbc.dao.CepDAO;
import br.com.pizza.jdbc.modelo.Cep;

public class ProcuraCepLogic implements BusinessLogic {
	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response)
			throws Exception {
			System.out.println("Executando a lógica e redirecionando...");
			
			Cep cep = new Cep();
			cep.setCep(request.getParameter("cep"));
			
						
			CepDAO dao = new CepDAO();
			dao.procura(cep); // linha que apresenta problemas
		
			
			RequestDispatcher rd = 
				request.getRequestDispatcher("/testaCeps.jsp");
			rd.forward(request, response);
		
	}
}

Poderiam me ajudar?

9 Respostas

A

Você declarou no DAO o método procura para receber como parâmetro uma String, você está passando para ele um objeto do tipo CEP..

thiagotn:
Pessoal, Estou fazendo uma aplicação que precisa pesquisar o endereço a partir de um CEP fornecido pelo usuário. Estou utilizando Jsp, JDBC, Mysql e Access( base de ceps ). O problema é que não consigo utilizar o método procura CEP que possuo, pois aparece a mensagem abaixo:
java.lang.Error: Unresolved compilation problem: 
	The method procura(String) in the type CepDAO is not applicable for the arguments (Cep)

	br.com.pizza.mvc.ProcuraCepLogic.execute(ProcuraCepLogic.java:21)
	br.com.pizza.mvc.ControllerServlet.service(ControllerServlet.java:29)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

Está é um trecho da classe de Modelo para o CEP:

package br.com.pizza.jdbc.modelo;

public class Cep {
	
	private String cep;
	private String tipo;
	private String bairro;
	private String nome;
	
	public String getCep() {
		return cep;
	}
	public void setCep(String cep) {
		this.cep = cep;
	}

Eis o meu método do meu DAO que deveria procurar o CEP:

public Cep procura(String cep) throws SQLException {
		PreparedStatement stmt = connection.prepareStatement("select * from Cep where cep=?");
		stmt.setString(1, cep);
		ResultSet rs = stmt.executeQuery();
		
		if(!rs.next()) return null;
		
		Cep c = new Cep();
		c.setCep(rs.getString("cep"));
		c.setTipo(rs.getString("tipo"));
		c.setNome(rs.getString("nome"));
		c.setBairro(rs.getString("bairro"));
		
		rs.close();
		stmt.close();
		return c; 
	}

E este é a classe Logic que utiliza o método procura:

package br.com.pizza.mvc;

import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import br.com.pizza.jdbc.dao.CepDAO;
import br.com.pizza.jdbc.modelo.Cep;

public class ProcuraCepLogic implements BusinessLogic {
	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response)
			throws Exception {
			System.out.println("Executando a lógica e redirecionando...");
			
			Cep cep = new Cep();
			cep.setCep(request.getParameter("cep"));
			
						
			CepDAO dao = new CepDAO();
			dao.procura(cep); // linha que apresenta problemas
		
			
			RequestDispatcher rd = 
				request.getRequestDispatcher("/testaCeps.jsp");
			rd.forward(request, response);
		
	}
}

Poderiam me ajudar?

T

André, obrigado pela ajuda!!

Corrigi da seguinte forma:

public class ProcuraCepLogic implements BusinessLogic {
	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response)
			throws Exception {
			System.out.println("Executando a lógica e redirecionando...");
			
			Cep cep = new Cep();
			cep.setCep((request.getParameter("cep")));
			
						
			CepDAO dao = new CepDAO();
			dao.getProcura(cep.getCep()); // agora estou passando a String Cep
			
			request.setAttribute("cep", cep); 
			
			
			RequestDispatcher rd = 
				request.getRequestDispatcher("/testeCeps2.jsp");
			rd.forward(request, response);
		
	}
}

Agora estou com problemas para apresentar o resultado no /testeCeps2.jsp

O código do jsp está desta forma:

<jsp:useBean id="dao" class="br.com.pizza.jdbc.dao.CepDAO"/>
    <c:forEach var="cep" items="${cep}" >
		<tr><td>${cep.cep}</td>
			<td>${cep.tipo}</td>
			<td>${cep.nome}</td>
			<td>${cep.bairro}</td></tr>
	</c:forEach>

E o Erro é este:

SEVERE: Servlet.service() for servlet syp threw exception
javax.servlet.jsp.JspTagException: Don't know how to iterate over supplied "items" in &lt;forEach&gt;
	at org.apache.taglibs.standard.tag.common.core.ForEachSupport.toForEachIterator(ForEachSupport.java:255)
	at org.apache.taglibs.standard.tag.common.core.ForEachSupport.supportedTypeForEachIterator(ForEachSupport.java:219)
	at org.apache.taglibs.standard.tag.common.core.ForEachSupport.prepare(ForEachSupport.java:137)
	at javax.servlet.jsp.jstl.core.LoopTagSupport.doStartTag(LoopTagSupport.java:227)
	at org.apache.jsp.testeCeps2_jsp._jspx_meth_c_005fforEach_005f0(testeCeps2_jsp.java:153)
	at org.apache.jsp.testeCeps2_jsp._jspService(testeCeps2_jsp.java:86)
	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:393)
	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.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:654)
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:445)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:379)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:292)
	at br.com.pizza.mvc.ProcuraCepLogic.execute(ProcuraCepLogic.java:28)
	at br.com.pizza.mvc.ControllerServlet.service(ControllerServlet.java:29)
	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.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	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:263)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Unknown Source)

Eu estou usando um System.out.println para imprimir os dados depois da consulta que é feita no método procura pelo DAO e os dados são apresentados no console normalmente, ou seja, a consulta está correta mas agora o problema é que eu não consigo mostrar o endereço que foi pesquisado na página Jsp. :cry:

Poderiam me ajudar?

A

vc tentou imprimir o conteúdo e o tipo do ${cep} ?? o que ele mostra??

[]´s

T

Bom dia André!

Ao tentar imprimir o resultado aparece o Erro acima, como se não fosse possível fazer o forEach:

# SEVERE: Servlet.service() for servlet syp threw exception  
# javax.servlet.jsp.JspTagException: Don't know how to iterate over supplied "items" in <forEach>  
#     at

Uma dúvida: Para imprimir um único resultado no Jsp, como eu poderia fazer? Acho que o problema é porque estou tentando fazer um forEach, mas só tem um resultado.( não sei se isto faz sentido, sou café com leite :oops: )

A

se o objeto cep for, por exemplo, um ArrayList quando passar pelo foreach e estiver vazio ele não vai imprimir nada, um problema que pode acontecer é se o cep estiver com valor nulo, ai ao passar no foreach dá pau… tenta imprimir na classe java - e não na jsp - o valor do cep depois que ele é calculado, veja se está nulo…

[]´s

T

Então…Eu estou dando um System.out.println no próprio método que procura o Cep para ver se o cep está sendo procurado e ele imprime normalmente o resultado no console do Eclipse, mas para o Jsp em si parece que estes valores não estão sendo repassados.

Agora estou no trabalho, senão colocaria este código.

A

Oi,

Achei um tópico semelhante no guj

http://www.guj.com.br/posts/list/28820.java

Tenta fazer igual ela fez usando o c:out

&lt;table border=1&gt;  
      
    &lt;tr&gt;  
       &lt;td&gt;Grupo&lt;/td&gt;   
       &lt;td&gt;Descrição&lt;/td&gt;      
    &lt;/tr&gt;  
    &lt;c:forEach var="item" items="${grupos}"&gt;  
    &lt;tr&gt;  
       &lt;td&gt;&lt;c:out value="${item.grupo}"/&gt;&lt;/td&gt;          
       &lt;td&gt;&lt;c:out value="${item.descricao}"/&gt;&lt;/td&gt;      
    &lt;/tr&gt;      
    &lt;/c:forEach&gt;  
    &lt;/table&gt;
T

Vlw André, vou tentar isso e qq coisa retorno!!

A
thiagotn:
Vlw André, vou tentar isso e qq coisa retorno!!

Thiago,

Não sei se você já conseguiu resolver, mas lendo com mais calma o tópico agora eu pude ver que você está passando para o request um objeto do tipo CEP e está interando nele.
Na verdade você tem que passar uma Collection de objetos, como um ArrayList de Ceps, ai depois vc intera nele, algo parecido com isso:

Na classe Java
CepDAO dao = new CepDAO();  
dao.getProcura(cep.getCep());               

List<Cep> ceps = new ArrayList<Cep>();
request.setAttribute("ceps", ceps);

Na jsp

<c:forEach var="cep" items="${ceps}" >  
         <tr><td>${cep.cep}</td>  
             <td>${cep.tipo}</td>  
             <td>${cep.nome}</td>  
             <td>${cep.bairro}</td></tr>  
     </c:forEach>
Criado 9 de junho de 2008
Ultima resposta 13 de jun. de 2008
Respostas 9
Participantes 2