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;