Nao consigo atualizar meu Objeto - Spring MVC + JSP

9 respostas
javaspring
D

Já consigo recuperar meu objeto da minha tabela para meu formulário, hora que vou persistir estou com erro.

Segue meu codigo.

Controller

/**
 * Método que recuprra a Tarefa Selecionada
 * @param tarefa
 * @param model
 * @return
 */
@RequestMapping("mostraTarefaSelecionada")
public String mostraFormularioAtualizacao(Tarefa tarefa,Model model){
    try {
        Connection connection = new ConnectionFactory().getConnection();
        TarefaDAO dao = new TarefaDAO(connection);
        model.addAttribute("tarefa", dao.buscaPorId(tarefa.getId()));
        return "tarefa/mostra";
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

/**
 * Após recuperar, atualiza o Objeto
 * @param id
 * @param model
 */
@RequestMapping("atualizarTarefaSelecionada")
public String buscaTarefa(Tarefa tarefa){
    try {
        Connection connection = new ConnectionFactory().getConnection();
        TarefaDAO dao = new TarefaDAO(connection);
        dao.atualizarTarefa(tarefa);
        return "redirect:listarTarefas";
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}

DAO

public void atualizarTarefa(Tarefa tarefa) {
    String sql = "UPDATE tarefas SET descricao = ?, finalizado = ?, data_finalizacao = ? WHERE id = ?";

    try {
        PreparedStatement prepareStatement = conn.prepareStatement(sql);
        prepareStatement.setString(1, tarefa.getDescricao());
        prepareStatement.setBoolean(2,tarefa.isFinalizado());
        prepareStatement.setDate(3, new Date(tarefa.getDataFinalizacao().getTimeInMillis()));
        prepareStatement.setLong(4, tarefa.getId());

        prepareStatement.execute();
        prepareStatement.close();
        conn.close();

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

meu Fomulário

Alterar tarefa - ${tarefa.id}

<form action="atualizarTarefaSelecionada" method="post"> 
    <input type="hidden" name="id" value="${tarefa.id}">

    Descrição:<br />
    <textarea rows="6" cols="18" name="descricao" >    ${tarefa.descricao} </textarea><br /> 

    Finalizado? <br/>
    <input type="checkbox" name="finalizado" value="true" ${tarefa.finalizado ? 'checked' : '' } /> <br />
    Data Finalizacao:
    <input type="text" name="dataFinalizacao" value="<fmt:formatDate value="${tarefa.dataFinalizacao.time}" pattern="dd/MM/yyyy" />" /> <br /> 
    <input type="submit" value="Enviar">
</form>

Meu Erro

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.RuntimeException: java.lang.NullPointerException

org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982)

org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)

javax.servlet.http.HttpServlet.service(HttpServlet.java:661)

org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)

javax.servlet.http.HttpServlet.service(HttpServlet.java:742)

org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

Root Cause

java.lang.RuntimeException: java.lang.NullPointerException

br.com.caelum.tarefas.controller.TarefasController.buscaTarefa(TarefasController.java:124)

sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)

sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

java.lang.reflect.Method.invoke(Unknown Source)

org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)

org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)

org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:114)

org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)

org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)

org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)

org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)

org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)

org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)

org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)

javax.servlet.http.HttpServlet.service(HttpServlet.java:661)

org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)

javax.servlet.http.HttpServlet.service(HttpServlet.java:742)

org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

Root Cause

java.lang.NullPointerException

br.com.caelum.tarefas.model.TarefaDAO.atualizarTarefa(TarefaDAO.java:114)

br.com.caelum.tarefas.controller.TarefasController.buscaTarefa(TarefasController.java:121)

sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)

sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

java.lang.reflect.Method.invoke(Unknown Source)

org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)

org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)

org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:114)

org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)

org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)

org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)

org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)

org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)

org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)

org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)

javax.servlet.http.HttpServlet.service(HttpServlet.java:661)

org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)

javax.servlet.http.HttpServlet.service(HttpServlet.java:742)

org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

9 Respostas

D

Cara não sei se pode ser isso, mas você está tentando setar o ID no seu Update…
Verifica se esse é o problema…

E coloca também:

where id='"+tarefa.getId()+"'";
D

nada ainda, sei o que é isso não rsrs;; Tenho até um modelo e segui os passos e nada.

D

Quando você aciona as informações do banco relacionadas ao id da tarefa aparecem corretamente no formulário?

D

Sim aparece as informações

OBS: Antes do Formulário tem Alterar tarefa -${tarefa.id} Ele não aparece o ID, mais os campos do formulário aparecem.

D

Não aparece o ID?
E como você sabe se ele está passando o ID quando você clica em enviar?

D

Pelo que entendi, o ID está nullo, mais quando eu clico em atualizar no meu dataTable, ele monta o objeto no meu outro formulário, após alteração ele apresenta o erro.

D

Cara… Debug no código!
Algumas sugestões:

  • Verifica o retorno do teu TarefaDao.buscaPorId();
  • Verifica se durante o POST da requisição o campo id do form está enviando o valor do ID da Tarefa.

Boa sorte!

D

Já fiz Debug e vi que ao submeter após recuperar o objeto, está null o ID, mais não sei como resolver isso.

D
@RequestMapping("mostraTarefaSelecionada")
public String mostraFormularioAtualizacao(Long id,Model model){// coloca o Long no Lugar do Tarefa
    try {
        Connection connection = new ConnectionFactory().getConnection();
        TarefaDAO dao = new TarefaDAO(connection);
        model.addAttribute("tarefa", dao.buscaPorId(id)); // coloca o ID
        return "tarefa/mostra";
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}


public void atualizarTarefa(Tarefa tarefa) {
   String sql = "UPDATE tarefas SET descricao=?, finalizado=? where id='"+tarefa.getId()+"'";

    try {
        PreparedStatement stmt= conn.prepareStatement(sql);
        stmt.setString(1, tarefa.getDescricao());
        stmt.setBoolean(2,tarefa.getFinalizado());  //altera na sua classe Tarefa para getFinalizado lá está isFinalizado teste sem a data antes

        stmt.execute();
        stmt.close();
        conn.close();

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

Seu lista tarefa deixa dessa forma:

@RequestMapping("listarTarefas")
	public String lista(Model model){
                //abertura da conexão
		TarefaDao dao = new TarefaDao();		
		model.addAttribute("tarefas", dao.lista());
		return "tarefa/lista";
	}

Onde mostra sua lista de tarefas deve estar assim:

<table>
  <tr>
      <th>Id</th>
      <th>Remover</th>
      <th>Alterar</th>
      <th>Descrição</th>
      <th>Finalizada</th>
      <th>Data Finalização</th>    
  </tr>

 <c:forEach items="${tarefas}" var="tarefa">
    <tr>
       <td>${tarefa.id}</td>
       <td><a href="removeTarefa?id=${tarefa.id}">Remover</a></td>
       <td><a href="mostrarTarefa?id=${tarefa.id}">Alterar</a></td>
       <td>${tarefa.descricao}</td>   
       <c:if test="${tarefa.finalizado eq false}">
          <td>Não finalizado</td>
       </c:if>
       <c:if test="${tarefa.finalizado eq true}">
          <td>Finalizado</td>
      </c:if>        
    </tr>
 </c:forEach>
</table>

Depois que é feita a atualização:

@RequestMapping("alterarTarefa")

	public String altera(Tarefa tarefa) {
           //abri a conexão
	  TarefaDao dao = new TarefaDao();
	  dao.altera(tarefa);
	  return "redirect:listarTarefas";
	}

Onde você altera:

<c:forEach items="${tarefas}" var="tarefa">

    <h3>Alterar tarefa - ${tarefa.id}</h3>
  
    <form action="alterarTarefa" method="post">
	
	   ID:<input type="text" name="id" value="${tarefa.id}" /></br>
  
       Descrição:<br />
       <textarea name="descricao" cols="100" rows="5">${tarefa.descricao}</textarea>    </br>      
	   Finalizado? <input type="checkbox" name="finalizado" value="true" ${tarefa.finalizado?'checked' : '' }/> <br />  
	 
       <input type="submit" value="Alterar"/>
    </form> 
 </c:forEach>

Testa ai para ver se dar certo, tenta fazer sem a data.
Se der certo tenta colocar a data…

Criado 11 de maio de 2017
Ultima resposta 12 de mai. de 2017
Respostas 9
Participantes 3