vraptor3 mysql datetime

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

Não deu certo, ele atualiza a data, porém a hora fica 00:00:00

o VRaptor só converte a data mesmo, por padrão =(

crie essa classe na sua aplicação:
https://github.com/caelum/vraptor/blob/master/vraptor-core/src/main/java/br/com/caelum/vraptor/converter/LocaleBasedDateConverter.java

trocando a linha do getDateInstance para getDateTimeInstance.

Fazendo isso o VRaptor vai usar a sua implementação ao invés da padrão.

se vc estiver usando Calendar use a classe:
https://github.com/caelum/vraptor/blob/master/vraptor-core/src/main/java/br/com/caelum/vraptor/converter/LocaleBasedCalendarConverter.java

[]'s

Obrigadasso, vou testar.
dou a resposta amanhã se funcionou.

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?

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

ele não está mais pegando a hora.
no primeiro momento ele pegava, agora não pega mais.

mas ele passa pelo converter?

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

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?

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