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

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?

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

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

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.

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

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

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

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

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

Digita ela no formato normal dd/MM/yyyy

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

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

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

Tem alguma forma de eu reescrever o converter do vraptor?

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.

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!

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

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

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

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.

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/

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

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;