Erro usando Spring MVC

Estou estudando Spring MVC pela apostila da Caelum e estou obtendo o seguinte erro no projeto:

“Request processing failed; nested exception is java.lang.IllegalArgumentException:
Name for argument type [java.lang.Long] not available, and parameter name information not found in
class file either.”

O Eclipse aponta o erro na linha destacada do arquivo TarefasController.java
Alguém pode ajudar? Grato!!!

Segue os arquivos java:

— TarefasController.java —

@Controller
public class TarefasController {
...
...

	@RequestMapping("mostraTarefa")
	public String mostra(Long id, Model model) {
	  JdbcTarefaDao dao = new JdbcTarefaDao();
	  **model.addAttribute("tarefas", dao.buscaPorId(id));   <----- Erro**
	  return "tarefa/mostra";
	}
}

— Tarefa.java —

public class Tarefa {
	private Long id;
	
	@NotNull @Size(min=5, message="Descrição deve ter pelo menos 5 carateres!")
	private String descricao;
	
	private boolean finalizado;
	
	@DateTimeFormat(pattern="dd/MM/yyyy")
	private Calendar dataFinalizacao;
	
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getDescricao() {
		return descricao;
	}
	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}
	public boolean isFinalizado() {
		return finalizado;
	}
	public void setFinalizado(boolean finalizado) {
		this.finalizado = finalizado;
	}
	public Calendar getDataFinalizacao() {
		return dataFinalizacao;
	}
	public void setDataFinalizacao(Calendar dataFinalizacao) {
		this.dataFinalizacao = dataFinalizacao;
	}
	
}

— JbdcTarefaDao.java —

public class JdbcTarefaDao {
		
	// a conexão com o banco de dados
	private Connection connection;
		 
	public JdbcTarefaDao(Connection connection) {
		this.connection = connection;
	}
		
	public JdbcTarefaDao() {
		this.connection = new ConnectionFactory().getConnection();
	}
			  
	// outro construtor e métodos do DAO        

		
	public void adiciona(Tarefa tarefa) {
	     ...
             ...
	}
		
	public List<Tarefa> getLista() {
	     ...
             ...		
	}
		
	public void remove(Tarefa tarefa) {		     	 
	     ...
             ...	
	}
	
	public void buscaPorId(Long id) {
		try {
			PreparedStatement stmt = connection.prepareStatement("select "
					+ "descricao from tarefas");
		    //stmt.setLong(1, tarefa.getId());
		    //stmt.setString(1, tarefa.getDescricao());
		    stmt.execute();
		    stmt.close();	         
		} catch (SQLException e) {
			//System.out.println("Message: " + e.getMessage());
		    throw new RuntimeException(e);
		}
		
	}
	
	 public void altera(Tarefa tarefa) {
	     ...
             ...
	 }
}

O médoto buscaPorId não retorna nada…

public void buscaPorId(Long id)

Deveria trazer uma Tarefa certo?

public Tarefa buscaPorId(Long id)
1 curtida

Tem q ter o retorno, como o LostSoldier está falando e coloca um break na linha de cima, acho q o Id está vindo nulo, você colocou um input com o name=“id” para o spring reconhecer e preencher esse id?

1 curtida

Pois bem, acredito que a função de busca deveria retornar algum objeto…
Se você está passando por parâmetro para a jsp algum objeto com nome “tarefas” seu dao.buscarPorId deveria retornar algum objeto. Neste caso a função de retorno é void.

public void buscaPorId(Long id) {
try {
PreparedStatement stmt = connection.prepareStatement("select "
+ “descricao from tarefas”);
//stmt.setLong(1, tarefa.getId());
//stmt.setString(1, tarefa.getDescricao());
stmt.execute();
stmt.close();
} catch (SQLException e) {
//System.out.println("Message: " + e.getMessage());
throw new RuntimeException(e);
}

}

retorne o que deseja procurar resolvendo o resultSet do seu statement.

Meus cumprimentos.

Pessoal, agradeço a ajuda, realmente, o método buscaPorId(Long id) tem que retornar um objeto, ficou assim:

public Tarefa buscaPorId(Long id) {

	String sql = "select * from tarefas where id = ?";		
	
	try {
		PreparedStatement stmt = this.connection.prepareStatement(sql);
		stmt.setLong(1, id);
		ResultSet rs = stmt.executeQuery();
		
		if (rs.next()) {
	    	// criando o objeto Tarefa
	        Tarefa tarefa = new Tarefa();

	        tarefa.setId(rs.getLong("id"));
	        tarefa.setDescricao(rs.getString("descricao"));
	        //tarefa.setDataFinalizacao(rs.getString("dataFinalizacao"));
	        		 		        
	        try {
	        	// montando a data através do Calendar
	        	Calendar data = Calendar.getInstance();
	        	data.setTime(rs.getDate("dataFinalizacao"));
	        	tarefa.setDataFinalizacao(data);
	        } catch (NullPointerException e) {
	        	System.out.println("Erro: " +e);
	        }
			
			return tarefa;		 
	    }
		//System.out.println("Descricao:" );
		rs.close();
	    stmt.close();
		
	} catch (SQLException e) {
		//throw new RuntimeException(e);
		System.out.println("Erro na busca: " +e);
	}
	return null;
}

Porém, fiz vários testes e parece que o valor do id está chegando nulo nesse método.
O id vem do arquivo, lista.jsp postado abaixo. Pelos testes, parece que o id e os demais argumentos não estão sendo passados para o método public void buscaPorId(Long id). O resultado desse método é passado para o mostra.jsp, que deveria editar os dados desse id, para serem alterados, porém, esses dados não estão aparecendo nesse arquivo mostra.jsp, Não consegui identificar o problema, estou iniciando no spring. Alguém pode ajudar? Grato!!

— lista.jsp —

<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>
<%@ taglib uri=“http://java.sun.com/jsp/jstl/fmt” prefix=“fmt” %>
<%@ page language=“java” contentType="text/html; charset=ISO-8859-1"
pageEncoding=“ISO-8859-1”%>

Lista Tarefas Criar nova tarefa

Id Descrição Finalizado? Data de finalização
${tarefa.id} ${tarefa.descricao} Finaliza agora! Finalizado Remover Alterar