doravan
Novembro 23, 2010, 2:04pm
#1
Estou tentando persistir um campo DataHora no banco, porém sempre recebo a mensagem is_not_a_valid_date.
Tendo utilizar 2010-10-10 08:00:00, 10/10/2010 08:00:00
E de forma alguma o banco quer aceitar.
Modelo
@Temporal(TemporalType.TIMESTAMP)
private java.util.Date dataedicao;
View
<inpyt type="text" id="dataedicao" name="tabela.dataedicao" />
Alguém pode dar uma ajuda? Como faço pra converter o formado java.util.Date para o mysql?
a mensagem não é por causa do banco…
é pq o VRaptor não está conseguindo converter a string que vc tah passando pra data.
creio que o formato que ele aceita seja, por padrão:
11-19-2010 08:10:34
ou seja, mês-dia-ano hora, o formato em inglês.
vc pode mudar o locale da aplicação pra pt_BR (no web.xml):
<context-param>
<param-name>javax.servlet.jsp.jstl.fmt.locale</param-name>
<param-value>pt_BR</param-value>
</context-param>
daí o formato vai ser:
23/11/2010 09:00:00
se ainda assim não funcionar é melhor criar um converter customizado mesmo
doravan
Novembro 23, 2010, 5:00pm
#3
Não deu certo, ele atualiza a data, porém a hora fica 00:00:00
doravan
Novembro 23, 2010, 10:18pm
#5
Obrigadasso, vou testar.
dou a resposta amanhã se funcionou.
doravan
Novembro 24, 2010, 10:02am
#6
Não deu certo da forma que vc indicou, porém eu fiz com o SimpleDateFormat
Ficou assim
Levando em consideração que vc tem a opção de adicionar a data e a hora, ou somente a data.
import java.text.DateFormat;
import java.text.MessageFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.ResourceBundle;
import br.com.caelum.vraptor.Convert;
import br.com.caelum.vraptor.Converter;
import br.com.caelum.vraptor.converter.ConversionError;
import br.com.caelum.vraptor.core.Localization;
import br.com.caelum.vraptor.ioc.RequestScoped;
/**
* Locale based date converter.
*
* @author Guilherme Silveira
*/
@Convert(Date.class)
@RequestScoped
public class LocaleBasedDateConverter
implements Converter<Date> {
private final Localization localization;
public LocaleBasedDateConverter(Localization localization) {
this.localization = localization;
}
public Date convert(String value, Class<? extends Date> type, ResourceBundle bundle) {
if (value == null || value.equals("")) {
return null;
}
Locale locale = localization.getLocale();
if (locale == null) {
locale = Locale.getDefault();
}
SimpleDateFormat longFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm");
SimpleDateFormat shortFormat = new SimpleDateFormat("dd/MM/yyyy");
try {
Date formatedDate;
if (value.length() <= 11)
formatedDate = shortFormat.parse(value);
else
formatedDate = longFormat.parse(value);
return formatedDate;
} catch (ParseException e) {
throw new ConversionError(MessageFormat.format(bundle.getString("nao_e_uma_data_valida"), value));
}
}
}
e desse seu jeito funciona?
doravan
Novembro 25, 2010, 8:38am
#8
Deu certo no primeiro momento, porém, depois dos testes, parou de funcionar no ambiente de produção.
Ainda não consigo fazer a conversão. Alguma dica?
parou de funcionar como? deu algum erro?
ele passa pelo seu converter?
coloque um log dentro dele pra ver se passa lah
doravan
Novembro 25, 2010, 1:10pm
#10
ele não está mais pegando a hora.
no primeiro momento ele pegava, agora não pega mais.
mas ele passa pelo converter?
doravan
Novembro 25, 2010, 5:33pm
#12
Sim, ele passa.
ao menos quando tento inserir uma data errada, ele indica a mensagem personalizada.
escreva um teste (do JUnit) pra essa classe e veja se quando vc passa só a data ele converte direito, e se vc passa data e hora ele também converte direito
doravan
Novembro 26, 2010, 8:53am
#14
Sucesso no JUnit!
A classe converte a data, porém a hora não persiste.
E sabe o que é incrível? Ela funciona quando quer…
Pra resolver o problema da hora eu criei outro campo.
Não vou confiar em utilizar data/hora com o mysql, ao menos não ainda.
Sei que é POG fazer isso, porém a hora é opcional, não vejo problema em ter um campo exclusivo pra isso.
@Column(columnDefinition = "TIME")
private String hora;
Aqui deu certo.
na sua classe LocaleBasedDateConverter ele converte certo tanto pra data qto pra data e hora?
doravan
Novembro 26, 2010, 2:03pm
#16
A idéia era criar um campo onde a hora é opcional, por isso o conversor faz a distinção dos dados através do tamanho da String inserida.
certo, mas o que vc pode fazer é que quando ele não coloca hora, vc adiciona na string um “00:00:00”, daí fica como meia noite e sempre tem uma hora na data