Conversão data/hora vraptor [Resolvido]

Estou com um problema de conversão no vraptor em que ele está ignorando a parte de hora pra um objeto do tipo java.util.Date

        @Temporal(TemporalType.TIMESTAMP)
	@Column(name = "DT_INICIO")
	private Date dataInicio;

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "DT_FIM")
	private Date dataFim;

Tenho um post que sai certo do formulario com (vi pelo firebug):

agenda.dataFim	06/03/2012 16:00:00
agenda.dataInicio	05/03/2012 15:30:00

so que no meu controlador um sysout dos campos imprime

Mon Mar 05 00:00:00 BRT 2012
Tue Mar 06 00:00:00 BRT 2012

ou seja parece que ele esta convertendo a parte da data mais ignorando a parte de hora .

utilizo o pacote br.com.caelum.vraptor.converter.l10n no web.xml pra fazer essas conversões .

Vou ter que criar o converter na mão ?? No pacote já não deveria vir previsto isso ??? Tenho a lib do jodatime no path também.

Bom eu tava dando uma olhada aqui no código fonte do Converter de data : LocaleBasedDataConverter vi que ele chamava apenas
o getDateInstance que despreza o conteudo da hora ao tentar fazer parse , fiz uma adaptação pra primeiro tentar a conversao com hora junto e senão conseguir ai sim tentar com data limpa sem hora .

Não sei boa pratica nesse caso de try catch dentro de try catch como ficaria mais elegante de ser feito . (Se puder darem uma olhada e sugerir algo mais bonito,ficaria agradecido).

Acabei chegando nisso , talvez seja interessante já arrumar essa classe no core do vraptor para dar suporte tanto a data limpa como data hora ja que o objeto Date suporta os dois e teoricamente essa classe ja deveria entender isso sem precisar maiores adaptações.

package dovraptor;

import java.text.DateFormat;
import java.text.MessageFormat;
import java.text.ParseException;
import java.util.Date;
import java.util.Locale;
import java.util.ResourceBundle;

import org.apache.commons.lang.StringUtils;

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;


@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 (StringUtils.isEmpty(value)) {
            return null;
        }

        Locale locale = localization.getLocale();
        if (locale == null) {
            locale = Locale.getDefault();
        }

        DateFormat formatDateTime = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,DateFormat.MEDIUM,locale);
        try {
            return formatDateTime.parse(value);
        } catch (ParseException pe) {
        	DateFormat formatDate = DateFormat.getDateInstance(DateFormat.SHORT,locale);
            try {
                return formatDate.parse(value);
            } catch (ParseException pe1) {	
            	throw new ConversionError(MessageFormat.format(bundle.getString("is_not_a_valid_date"), value));
            }        	
        }
    }

}

o converter que vc fez suporta o que vc precisa?

Sim agora ta funcionando , depois dessa modificação que eu fiz no converter passou a funcionar , ja que o implementado atualmente despreza a parte de hora do objeto. Na verdade sobrescrevi o converter oficial .

Creio que o comportamento esperado pra um converter desse tipo por padrão no framework seja entender tanto um quanto outro não ?? Ja que o objeto Date tem como atributos hora , minuto , segundo , etc.

quer mandar um pull request pro vraptor com esse código?

o problema é que talvez ficar testando vários formatos diferentes talvez seja pouco performático… mas não é tanto problema…
precisa escrever um teste com todos os formatos de datas suportados (embora dependa do locale)

[quote=Lucas Cavalcanti]quer mandar um pull request pro vraptor com esse código?

o problema é que talvez ficar testando vários formatos diferentes talvez seja pouco performático… mas não é tanto problema…
precisa escrever um teste com todos os formatos de datas suportados (embora dependa do locale)[/quote]

Não trabalho com git ainda infelizmente … preciso começar a trabalhar com ele … entao se puder pedir pra outra pessoa fazer o pull pra voce com esse código …e talvez se tiver uma ideia melhor pra ficar mais performatico … seria uma boa e escrever alguns testes… . Não sei como ta a parte de teste do vraptor quando envolve locale … mas quanto a teste creio que o próprio getDateTimeInstance passando o locale garanta o parse com hora não ?? Assim como o getDateInstance garante hoje…

De todo modo vou colocar um resolvido no tópico.

não precisa trabalhar com git :wink:

e o teste:

só clicar em “Edit this file” que ele já pede pra fazer o pull request :wink: