[RESOLVIDO] VRaptor + Hibernate + Html5 - Atributo do tipo date

26 respostas
C

Boa tarde, estou com o seguinte problema:
Vou começar a usar date somente agora, então não possuo muito conhecimento… primeiro… escrevi ele da seguinte forma na minha classe de modelo e com os seguintes imports:

import org.hibernate.annotations.Type;
import java.sql.Date;

@Column
	@Type(type="date")
	private Date dataCadastro;

e na jsp, da seguinte forma:

<input name="entidade.dataCadastro" type="date" value="${entidade.dataCadastro}"/>

Se eu colocar uma data manualmente através do banco de dados, quando acesso a entidade na jsp ele trás a data corretamente no meu input.
Mas quando ele vai fazer o updade, eu tendo mudado ou não a data (estou usando datepicker do html 5)
ele da a seguinte msg de erro:

mas a entidade é private, então quando faço o get para testar o que ele está recebendo… o resultado é null.
Não sei onde posso tratar a data, alguém tem alguma solução?

26 Respostas

R

Primeira solução: troque de Date para Calendar.

Pode me mostrar como que a data fica no seu input?

C

Quando ela vem do banco, ou selecione pelo calendário ele exibe no input da seguinte forma: dd/mm/aaaa

Mudei para calendar, mas deu o mesmo erro.

R

Tira o input do HTML 5… Trate essa data como um texto e envie pro servidor nesse formato…

C

Ai que está, eu gostaria de manter o input date do html5…

R

Isso é só para fazermos um teste e conseguirmos descobrir o erro…

C

Com String funciona normalmente… só não queria deixar String porque acho errado… acho que este atribute deve ser do tipo date mesmo…

C

com input type text, e atributo tipo Date…
digitei da mesma forma que ele gravava no banco "2013-03-13"
mas deu o mesmo erro

R

Digita ela no formato normal dd/MM/yyyy

Usa o tipo Calendar no java e o type=“text” no input…

C

Digitei da forma que você falou, e salvou certo… quando fui na pagina de edição, ele estava aaaa/mm/dd

Estou bem perdido sobre o que está acontecendo

R

Acontece o seguinte: quando enviamos a data do formulário para o servidor, ele vai como String, ai o VRaptor usa um converter de Calendar para decifrar a String que você está mandando.

Essa mensagem de erro: "???is_not_a_valid_date??? " é do converter do VRaptor. Ou seja, a data está vindo em um formato diferente do esperado: “dd/MM/yyyy”.

Veja se o input date do HTML5 não tem um campo pattern que muda a forma como a data é enviada ao server.

Quando você volta do servidor para o browser, o ideal é que você retorne a data como String já no formato certo…

PS: Use o tipo Calendar na sua entity e retire o @Type

C

Tem alguma forma de eu reescrever o converter do vraptor?

R

Tem. Basta criar uma classe e chamar de CalendarConverter, implemente-a com a interface Converter<Calendar> do VRaptor…

E anote com @Convert(Calendar.class).

Dai vc vai receber uma String, nessa string tem a sua data vinda do browser.

Faça a conversão e retorne para o VRaptor que ele cuida do resto…

Vale lembrar que você pode receber o que precisar no construtor do converter que a DI também vale para converters.

C

Muito obrigado, não conheço muito de orientação a objetos e por isso não sabia como fazer, mas sabia que era possível…
Vou tentar resolver aqui, qualquer coisa posto o que eu preciso de ajudo, ou o metodo como resolvi…

obrigado!

R

Dê uma estudada sobre o java, estude, também, a apostila FJ-28, ajuda bastante…

http://www.caelum.com.br/apostila-vraptor-hibernate/

V

Por favor, evite abusar das LETRAS MAIÚSCULAS no título do tópico.

C

Solução:

@Convert(Date.class)  
public class DateConverter implements Converter<Date> {  
  
    @Override  
    public Date convert(String value, Class<? extends Date> arg1, ResourceBundle arg2) {  
            try {
				return new SimpleDateFormat("yyyy-MM-dd").parse(value);
			} catch (ParseException e) {
				return null; 
			}
			 
    }  
  
}

Muito obrigado, Rafael Guerreiro.

R

Cara, sério, FUJA de Date… Não faça isso… Se quiser saber, o melhor mesmo é o DateTime do JodaTime… É muito melhor para manipular datas.

Esse aqui é um exemplo:
http://blog.caelum.com.br/o-eterno-problema-de-calcular-a-diferenca-de-dias-entre-duas-datas-em-java/

C

Vou usar date para guardar os dados no banco, mas para o resto vou usar joda…

R

Não precisa, você não está usando Hibernate? Ele consegue converter para você, não precisa se preocupar com isso.

Você vai precisar baixar um jar chamado joda-time-hibernate-1.3.jar

Coloque ele no seu classpath e na sua entidade fica assim:

@Column()
@Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")
private DateTime date;
C

nossa, vou fazer assim então… melhor ainda…
valeu, obrigado!

R

Rafael Guerreiro ou Clarel.filho me ajudem ! haha

Estava ocorrendo um erro parecido comigo, eu inseria meu valor no campo de data, mostrava meu valor sendo passado através da uri, mas na hora de manda o valor para o atributo(seta-lo) o atributo recebia null. Ai inseri o tal locale pt-Br no meu web.xml , e o erro agora é o seguinte !
No meu atributo eu recebo o valor " (java.util.Date) Sat Oct 12 00:00:00 BRT 1991 "

Mas na hora de salvar é gerado uma exception na minha página

Outra coisa, acho estranho ele estar passando este valor para o atributo, pq o valor que passo é dd/MM/yyyy

<label for="nascimento">Data Nascimento:</label> <input id="nascimento" type="text" name="pessoa.dataNascimento" value="<fmt:formatDate value="${pessoa.dataNascimento}" pattern="dd/MM/yyyy"/>"/>

Agradeço a atenção !

L

isso não tem a ver com a seralização, é conflito de versão de jars…

dá uma olhada se vc não tem jars do hibernate com versões diferentes no classpath.

R

Lucas desculpa utilizar mais de um tópico, vou utilizar apenas este pois o problema é o mesmo que estou passando !
Os jars do hibernate foram inseridos na biblioteca através do netbeans, inseri apenas o hibernate.validator 3.1, vou retira-lo agora e fazer mais um teste para ver o que acontece.
Ja volto com a resposta !!!

R

Aeeeeeeee !!! Agora sim ! hahahahaha.
Cara mas por qual motivo não consigo utilizar o jar do hibernate.validator então ? Pelo menos as validações ele estava fazendo da maneira correta, validava email, cpf, valores nulos. É uma pena não poder utilizar ele ! Mas pelo menos está salvando ! Obrigado pela paciência e colaboração Lucas ! Desculpa qualquer coisa !

L

vc pode usar ele sim, mas vc precisa usar uma versão compatível com o hibernate-core que vc tá usando…

tente usar o hibernate validator 4

R

A não cara ele valida sim, nas bibliotecas que o netbeans fornece já deve possuir o jar para validação, por isso estava dando conflito, eu estava inserindo outro jar. Voce tinha toda razão mesmo.
segue os importes das validações.

import org.hibernate.validator.constraints.Email; import org.hibernate.validator.constraints.br.CPF;

Mas enfim, obrigado mais uma vez ! Estava matando cachorro a grito com isso !
Agora vou terminar de estudar esta apostila da caelum pra dar continuidade no meu tcc, até lá vou voltar aqui algumas vezes srrs

Abraços !

Criado 7 de março de 2013
Ultima resposta 7 de mai. de 2013
Respostas 26
Participantes 5