Converter do VRaptor [RESOLVIDO]

Pessoal,

Estou usando o vraptor pela primeira vez, e tenho um problema.

Eu tenho um atributo do tipo Calendar na minha classe, e um campo no formulário no formato dd/MM/yyyy. Teoricamente ele deveria chamar o converter LocaleBasedCalendarConverter automaticamente correto?

Poid bem, não está passando no converter, tentei implementar um colocando a anotação @Convert e implementando a interface Converter, só que também não está passando nos converters que eu estou implementando.

Pelo que eu entendi, não é necessário fazer nenhuma configuração adicional para usar converters, ou estou esquecendo de algo?

Seu converter está assim:

[code]import java.util.Calendar;
import java.util.ResourceBundle;

import br.com.caelum.vraptor.Convert;
import br.com.caelum.vraptor.Converter;
import br.com.caelum.vraptor.ioc.ApplicationScoped;
import br.com.wsacervoweb.enums.TipoFormatoData;
import br.com.wsacervoweb.utils.SiteUtil;

@Convert(Calendar.class)
@ApplicationScoped
public class CalendarConverter implements Converter<Calendar> {
public Calendar convert(String value, Class<? extends Calendar> type,
ResourceBundle bundle) {
// retorna a conversão
return SiteUtil.stringToCalendar(value, TipoFormatoData.dd_MM_yyyy);
}

}[/code]

Na verdade eu deletei o Converter que eu criei, estou tentando utilizar o Converter Default que já vem no VRaptor.

você configurou o locale da aplicação no web.xml como pt_BR?

sim, da seguinte maneira:

<context-param>
	    <param-name>javax.servlet.jsp.jstl.fmt.locale</param-name>
	    <param-value>pt_BR</param-value>
	</context-param>

Tá parecendo um problema de locale mesmo, porque quando submito o form, o valor da data muda de 29/01/1985 para 47/58/1560.

faz um teste por favor:

coloque uma data no result (result.include(“hoje”, Calendar.getInstance());

e faça em um jsp:

<fmt:formatDate value="${hoje}" style="LONG"/>

Aconteceu a seguinte exceção:

javax.el.ELException: Cannot convert java.util.GregorianCalendar[time=1309880582251,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="GMT-03:00",offset=-10800000,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=2,minimalDaysInFirstWeek=1,ERA=1,YEAR=2011,MONTH=6,WEEK_OF_YEAR=28,WEEK_OF_MONTH=2,DAY_OF_MONTH=5,DAY_OF_YEAR=186,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=0,HOUR_OF_DAY=12,MINUTE=43,SECOND=2,MILLISECOND=251,ZONE_OFFSET=-10800000,DST_OFFSET=0] of type class java.util.GregorianCalendar to class java.util.Date

Parece q essa tag deve receber um Date né.

meu jsp ficou assim:

<fmt:formatDate value="${hoje}" dateStyle="LONG"/>

Em vez de colocar um Calendar na session eu coloquei um Date, aí formatou da seguinte maneira:

5 de Julho de 2011

hum, só pra confirmar uma coisa: mande 29/01/84 ao invés de 29/01/1984

Mandando 29/01/84 ele se transformou em 44/41/93.

bom, um jeito fácil de resolver é criando o seu próprio converter mesmo…

só pra ver qual dos formatos ele está aceitando, tenta:

2011-01-01
23-12-2010
12-23-2010

Bom,

Resolvi da maneira mais fácil, mudei meu atributo pra Date e coloquei meu campo do jsp assim:

<input type="text" id="nascimento" name="cliente.dataDeNascimento" value="<fmt:formatDate value="${cliente.dataDeNascimento}" pattern="dd/MM/yyyy"/>"/>

Só que ficar usando Date é tenso né.

como estava antes no jsp?

Cara, acabou que acho que o problema todo era vício de uso do JSF, porque o converter do Vraptor não converte o valor na volta da requisição, como os converters do JSF.

Não sei se me expressei bem. Mas o correto do VRaptor seria usar o fmt no value dos campos mesmo, correto?

é, o VRaptor usa jsp puro, e infelizmente nele vc precisa colocar o format manualmente…

vc pode usar Calendar, mas no formatDate vc precisa colocar um .time no final:

<input type="text" id="nascimento" name="cliente.dataDeNascimento" value="<fmt:formatDate value="${cliente.dataDeNascimento.time}" pattern="dd/MM/yyyy"/>"/>  

ao invés de pattern, vc pode usar só style=“MEDIUM”, se o locale estiver setado corretamente

É isso mesmo,

Muito obrigado pela ajuda!