Ir ao conteúdo
  • Cadastre-se

Erro usando Spring MVC


Posts recomendados

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) {
         ...
         ...
     }
}


 

Link para o comentário
Compartilhar em outros sites

Acredito que o problema seja porque o Id está nulo ... de onde vem esse Id??? 
por exemplo:

@RequestMapping(value="/user/{userId}/invoices", method = RequestMethod.GET)
public List<Invoice> listUsersInvoices(
            @PathVariable("userId") int user,
            @RequestParam(value = "date", required = false) Date dateOrNull) {
  ...
}

@PathVariable e @RequestParam ambos e seus modos de uso. Com isso força o aluno a dar um gas maior

Link para o comentário
Compartilhar em outros sites

Psykotico, o id vem desse 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. 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"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
  <script type="text/javascript" src="resources/js/jquery.js"></script>
  <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
  <title>Lista Tarefas</title>
</head>
<body>  
  <script type="text/javascript">
    function finalizaAgora(id) {
      $.post("finalizaTarefa", {'id' : id}, function() {
        // selecionando o elemento html através da 
        // ID e alterando o HTML dele 
        $("#tarefa_"+id).html("Finalizado");
      });
    }
  </script>
  <a href="novaTarefa">Criar nova tarefa</a> 
  <br /> <br />        
  <table>
  <tr>
    <th>Id</th>
    <th>Descrição</th>
    <th>Finalizado?</th>
    <th>Data de finalização</th>
  </tr>
  <c:forEach items="${tarefas}" var="tarefa">
    <tr>
      <td>${tarefa.id}</td>
      <td>${tarefa.descricao}</td>
      <c:if test="${tarefa.finalizado eq false}">
        <td id="tarefa_${tarefa.id}">
          <a href="#" onClick="finalizaTarefa(${tarefa.id})">
          Finaliza agora!
          </a>
        </td>        
      </c:if>
      <c:if test="${tarefa.finalizado eq true}">
        <td>Finalizado</td>
      </c:if>
      <td>
        <fmt:formatDate 
          value="${tarefa.dataFinalizacao.time}" 
          pattern="dd/MM/yyyy"/>
      </td>
      <td><a href="removeTarefa?id=${tarefa.id}">Remover</a></td>
      <td><a href="mostraTarefa?id=${tarefa.id}">Alterar</a></td>
    </tr>
  </c:forEach>
  </table>
</body>
</html>

Link para o comentário
Compartilhar em outros sites

Certo ... pelo que percebi você está usando Ajax pra fazer essa chamada ... mas você não está mapeando essa rota no seu controller ... faça assim:
 

@Controller
public class TarefasController {
...
...
    //RequestMapping registra no servlet a rota e o método http que esse código irá responder
    @RequestMapping("/finalizaTarefa", method = RequestMethod.POST)
    //A anotação RequestBody sinaliza para o Spring capturar a informação do corpo da requisição
    public String finaliza(@RequestBody Long id, Model model) {
      JdbcTarefaDao dao = new JdbcTarefaDao();
      model.addAttribute("tarefas", dao.buscaPorId(id));
      return "tarefa/mostra";
    }
}

Mas acredito que, por usar Ajax, seu objetivo é que os dados que você está buscando sejam setados diretamente pelo javascript ... com isso seria bom usar dessa forma:

@Controller
public class TarefasController {
...
...
    @RequestMapping("/finalizaTarefa", method = RequestMethod.POST)
    //A anotação ResponseBody indica para o Spring que o retorno do método será serializado (como padrão JSON)
    @ResponseBody
    public Tarefa finaliza(@RequestBody Long id, Model model) {
      JdbcTarefaDao dao = new JdbcTarefaDao();
      Tarefa tarefa = dao.buscaPorId(id);
      return tarefa;
    }
}

E continuando as dicas, o DAO é um serviço do seu sistema ... com isso você pode anotar ele para que ele possa ser injetado no controller ... assim:

@Service
public class JdbcTarefaDao {
  ...
}

@Controller
public class TarefasController {

    @Autowired
    private JdbcTarefaDao dao;
...
    @RequestMapping("/finalizaTarefa", method = RequestMethod.POST)
    //A anotação ResponseBody indica para o Spring que o retorno do método será serializado (como padrão JSON)
    @ResponseBody
    public Tarefa finaliza(@RequestBody Long id, Model model) {
      Tarefa tarefa = dao.buscaPorId(id);
      return tarefa;
    }
}

 

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...