Problema ao alterar dados . Struts 2

14 respostas
J

Boa noite , estou mexendo com Struts 2 e cai em uma dificuldade com o fato de alterar dados .

Consigo remover e incluir legal , porém alterar está meio complicado .

Segue o código .

public void altera(Tarefa tarefa){
  		
  		String sql = "update tab_tar set descricao=?, finalizado=?, dataFinalizacao=?  where id=?";
  		
  		try {
  			PreparedStatement stmt = connection.prepareStatement(sql);
			
  			stmt.setString(1,tarefa.getDescricao() );
  			stmt.setString(2, tarefa.getFinalizado());  			
  			stmt.setDate(3, (Date) (tarefa.getDataFinalizacao().getTime()));
  			
  			stmt.setLong(4, tarefa.getId());
  			
  			stmt.execute();
  			stmt.close();
  			
  		} catch (SQLException e) {
  			throw new RuntimeException(e);
  		}
  	}

Ele gera a excpetion neta linha : stmt.setDate(3, (Date) (tarefa.getDataFinalizacao().getTime()));]

E esta é a exepction : java.lang.ClassCastException: java.util.Date cannot be cast to java.sql.Date

Bom eu já tentei resolver , e eu sei que o erro está no import , eu sei que não é a mesma coisa SQL.DATE e UTIL.DATE PORÉM

Eu já tentei de tudo para resolver e não consegui .

Já tentei mudar o import para java.util.date e consequentemente mudar a linha porém de nenhuma forma ele aceita.

Ele pede para que eu faça o cast para sql.date , parece que o PREPAREDSTATEMENT não trabalaha com util sei lá .

Já tentei deixar a linha assim também : stmt.setDate(3, tarefa.getDataFinalizacao());

Porém NADA.

Se alguém souber me ajudar eu vou ficar muito agradecido pois já estou enrolado a mais de uma semana com isso .

MUITO OBRIGADO !!!

14 Respostas

J

UP UP UP UP POR FAVOR…

ALGUÉM???

L

Se não me engano a classe javax.sql.Date tem um construtor que recebe uma java.util.Date ou um long com o timestamp.

Só fazer isso:
pstmt.setDate(new javax.sql.Date(tarefa.getDataFinalizacao()));

J

MUITO OBRIGADO pela resposta.

Eu fiz do jeito que você me falou , porém ele fala para mudar o tipo do retorno para LONG.

Se eu fizer isso vou ter que mudar minha variável dataFinalizacao para LONG . (ELA É CALENDAR).

Alguma sugestão??

E muito obrigado pela resposta.

jyoshiriro

Pelo que falou, parece que o método “getId()” da sua classe Tarefa não retorna Long.

J

Realmente ele não retorna um Long , ele retorna um Calendar .

Mais a minha dúvida , é que se eu passar ele para Long eu não vou ter problemas com o banco de dados quanto a formatação para DATE?

Obrigado

jyoshiriro

Olá.

Olha, não conheço sua aruqitetura ai, mas me parece no mínimo estranho um método “getId” retornar um Calendar… Pouca semântica, não acha?

Só podemos te ajudar mais se vermos mais detalhes de seu código :wink:

J

hehe foi mal , eu li errado sua msg.

é o dataFinalizacao que é Calendar o Id é Long mesmo .

Porém continua dando o erro alguém pode saber?

drsmachado

Na verdade, não precisa.
Como o camarada disse acima, um dos construtores da java.sql.Date recebe um long como parâmetro.
Assim sendo, você pode utilizar o getTimeInMillis da calendar

GregorianCalendar gc = new GregorianCalendar();
		java.sql.Date dt = new java.sql.Date(gc.getTimeInMillis());
//e então
stmt.setDate(3, dt);
J

Obrigado gente !

Consegui pegar a data .

Muito obrigado mesmo .

Porém me deparei com outro problema …

Na hora de pegar o ID ele vem como nulo …

Estou com uma dúvida quanto a pegar esse ID .

Na minha JSP eu deixei ele como hidden para poder pegar na outra classe , segue a JSP :

<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<html>
<body>
	<h3>Alterar tarefa - ${tarefa.id}</h3>
	
	<form action="altera" method="post">
	
		<input type="hidden" name="tarefa.id" value="${tarefa.id}" />
		Cap&iacute;otulo Descri&ccedil;&atilde;o:<br />
		
		<textarea name="tarefa.descricao" cols="100" rows="5">${tarefa.descricao}</textarea>
		
		<br /> 
		
		Finalizado? 
		
	<input type="text" name="tarefa.finalizado" />			
			
		<br /> 
		
		Data de finaliza&ccedil;&atilde;o: <br /> <input type="text"
			name="tarefa.dataFinalizacao"
			
			value="<fmt:formatDate value="${tarefa.dataFinalizacao.time}" pattern="dd/MM/yyyy" />" />
			
		<br /> 
		
		<input type="submit" value="Alterar" />
		
	</form>
</body>
</html>

Porém eu não consigo pegar o ID . Segue o código :

public void altera(Tarefa tarefa){
  		
  		String sql = "update tab_tar set descricao=?, finalizado=?, dataFinalizacao=?  where id=?";
  		
  		try {
  			PreparedStatement stmt = connection.prepareStatement(sql);
			
  			stmt.setString(1,tarefa.getDescricao() );
  			stmt.setString(2, tarefa.getFinalizado());  	
  			
  		    java.sql.Date dt = new java.sql.Date(tarefa.getDataFinalizacao().getTimeInMillis());  
  			stmt.setDate(3, dt);
  			
  			stmt.setLong(4, tarefa.getId());
  			
  			stmt.execute();
  			stmt.close();
  			
  		} catch (SQLException e) {
  			throw new RuntimeException(e);
  		}
  	}

Ele gera NULLPOINTER nessa linha : stmt.setLong(4, tarefa.getId());

É como se eu não tivesse pego o parâmetro …

Alguém pode me dar uma luz ?

J

UP UP UP UP UP UP

J

Alguém por favor???

J

Por favor gente alguém ???

Só uma pessoa que seja por favor…

J

UP UP UP

drsmachado

Isso é o tipo de coisa que não ajuda.

Criado 2 de novembro de 2011
Ultima resposta 8 de nov. de 2011
Respostas 14
Participantes 4