Ir ao conteúdo

Posts recomendados

Postado

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


 

Postado

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

Postado

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>

Postado

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;
    }
}

 

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...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!