Erro java.lang.NoSuchMethodError no exercício

Olá galera fazendo o exercício da apostila f21 da caelum no capítulo 10 tive esse erro java.lang.NoSuchMethodError, no stacktrace ele aponta para minha classe ContatoDAO mas eu não consigo ver o problema, o erro ocorreu depois que eu fiz o filtro para conexão com o banco, Quando tento verificar o lista de contatos para tentar alterar um registro esse erro é levantado, olhei no meu web.xml e o mapeamento do filtro está correto não consigo ver o erro, peço a ajuda de vocês, alguém sabe o porque do erro? Desde já agradeço

classe CoantatoDAO

package br.com.estudo.DAO;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import br.com.estudo.modelo.Contato;

public class ContatoDAO {

	private Connection con;

	public ContatoDAO(Connection connection) {
		this.con = connection;
	}

	public void adiciona(Contato contato) {
		String sql = "INSERT INTO contatos"
				+ "(nome, email, endereco, dataNascimento)"
				+ "values (?,?,?,?)";
	
		try {
			//Preparedstatement para inserção 
			PreparedStatement stmt = con.prepareStatement(sql);
			
			//seta os valores 
			stmt.setString(1, contato.getNome());
			stmt.setString(2, contato.getEmail());
			stmt.setString(3, contato.getEndereco());
			stmt.setDate(4, new Date(contato.getDataNascimento().getTimeInMillis()));
			
			//executando 
			stmt.execute();
			stmt.close();
			
			
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	public List<Contato> getLista(){
		
		try {
			List<Contato> lista = new ArrayList<Contato>();
			PreparedStatement stmt = this.con.prepareStatement("select * from contatos");
			
			ResultSet rs = stmt.executeQuery();
			
			while(rs.next()){
				
				Contato contato = new Contato();
				contato.setId(rs.getInt("id"));
				contato.setNome(rs.getString("nome"));
				contato.setEmail(rs.getString("email"));
				contato.setEndereco(rs.getString("endereco"));
				
				//montando a data
				Calendar data = Calendar.getInstance();
				data.setTime(rs.getDate("dataNascimento"));
				contato.setDataNascimento(data);
				
				//add o objeto a lista
				lista.add(contato);
			}
			
			rs.close();
			stmt.close();
			return lista;
			
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	
	public Contato pesquisar(long id){
	    Contato contato = null;
		try {
			PreparedStatement stmt = this.con.prepareStatement("SELECT * FROM contatos WHERE id=" + id);
			
			ResultSet rs = stmt.executeQuery();
             while(rs.next()){
				
				contato = new Contato();
				contato.setId(rs.getLong("id"));
				contato.setNome(rs.getString("nome"));
				contato.setEmail(rs.getString("email"));
				contato.setEndereco(rs.getString("endereco"));
				
				//montando a data
				Calendar data = Calendar.getInstance();
				data.setTime(rs.getDate("dataNascimento"));
				contato.setDataNascimento(data);
				
				//add o objeto a lista
			}
             rs.close();
             stmt.close();
             return contato;
			
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	
	public void altera(Contato contato){
		
		String sql = "UPDATE contatos SET nome=?, email=?, endereco=?, dataNascimento=? WHERE id=?";
		
		try {
			
			PreparedStatement stmt = con.prepareStatement(sql);
			stmt.setString(1, contato.getNome());
			stmt.setString(2,  contato.getEmail());
			stmt.setString(3, contato.getEndereco());
			stmt.setDate(4, new Date(contato.getDataNascimento().getTimeInMillis()));
			
			stmt.setLong(5, contato.getId());
			stmt.execute();
			stmt.close();
			
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
		
	}
	
	
	public void remove(Contato contato){
		try {
			PreparedStatement stmt = con.prepareStatement("DELETE FROM contatos WHERE id=?");
			stmt.setLong(1, contato.getId());
			stmt.execute();
			stmt.close();
			
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
}

filtro

package br.com.estudo.filtro;

import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import br.com.estudo.DAO.ConnectionFactory;


public class FiltroConexao implements Filter {

	@Override
	public void destroy() {
		// TODO Auto-generated method stub

	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {

		try {

			Connection connection = new ConnectionFactory().getConnection();

			request.setAttribute("conexo", connection);

			chain.doFilter(request, response);

			connection.close();

		} catch (SQLException e) {
			throw new ServletException(e);
		}

	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub

	}

}

Servlet que altera e adiciona contato

package br.com.estudo.mvc.logica;

import java.io.PrintWriter;
import java.sql.Connection;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

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

import br.com.estudo.DAO.ContatoDAO;
import br.com.estudo.modelo.Contato;

public class AlteraContato implements Logica {

	@Override
	public void executa(HttpServletRequest request, HttpServletResponse response)
			throws Exception {

		String idTexto = request.getParameter("id");
		
		if(idTexto != null){
		
		long id = Long.parseLong(idTexto);
		Contato contato = new Contato();
		contato.setId(id);
		contato.setNome(request.getParameter("nome"));
		contato.setEndereco(request.getParameter("endereco"));
		contato.setEmail(request.getParameter("email"));

		// converte a data
		String dataEmTexto = request.getParameter("dataNascimento");
		Date date = new SimpleDateFormat("dd/MM/yyyy").parse(dataEmTexto);

		Calendar dataNascimento = Calendar.getInstance();
		dataNascimento.setTime(date);

		contato.setDataNascimento(dataNascimento);
		
		Connection connection = (Connection) request.getAttribute("conexao");

		ContatoDAO dao = new ContatoDAO(connection);
		dao.altera(contato);
		System.out.println("Alterando o contato" + contato.getNome());
		
		}else{
			
			PrintWriter out = response.getWriter();
			
			String nome = request.getParameter("nome");
			String email = request.getParameter("email");
			String endereco = request.getParameter("endereco");
			String dataTexto = request.getParameter("dataNascimento");
			
			Calendar dataNascimento = null;
			
			try {
				Date data = new SimpleDateFormat("dd/MM/yyyy").parse(dataTexto);
				dataNascimento = Calendar.getInstance();
				dataNascimento.setTime(data);	
			} catch (ParseException e) {
				out.println("Erro de conversão de data!");
				return;// para a execucao do metodo
			}
			
			
			Contato contato = new Contato();
			contato.setNome(nome);
			contato.setEmail(email);
			contato.setEndereco(endereco);
			contato.setDataNascimento(dataNascimento);
			
			
			Connection connection = (Connection) request.getAttribute("conexao");
			
			ContatoDAO dao = new ContatoDAO(connection);
			dao.adiciona(contato);
		}

		RequestDispatcher rd = request
				.getRequestDispatcher("/lista-contato-elegantes.jsp");
		rd.forward(request, response);

		
	}

}

Por favor poste o stacktrace do erro assim fica mais fácil identificarmos…

Aparentemente você está chamando um método que não existe, fique atendo ao parâmetro do método e veja se está passando os parâmetros corretamente.