Pessoal, existe alguma forma do Webwork recuperar uma data dd/MM/yyyy do meu textfield para o campo date do meu bean?
Data no Webwork
8 Respostas
Nope … vc terá que fazer seu proprio type converter e registra-lo para o tipo Date … veja essa mensagem para entender melhor porque.
O grande problema é que os conversores atualmente simplesmente ignoram o locale …
/*
* Created on 19/01/2005
* by Marcelo Esperandio
* project: erp
* package: br.com.atmtec.converter
* class..: DateConverter
*/
package br.com.atmtec.converter;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Map;
import br.com.atmtec.component.I18nSupport;
import com.opensymphony.xwork.ActionContext;
import ognl.DefaultTypeConverter;
/**
* @author Marcelo Esperandio
*/
public class DateConverter extends DefaultTypeConverter {
private static final String SLASH = "/";
private static final int pt_BR = 1;
private static final int en_US = 2;
private static final int es_ES = 3;
/* (non-Javadoc)
* @see ognl.DefaultTypeConverter#convertValue(java.util.Map, java.lang.Object, java.lang.Class)
*/
public Object convertValue(Map context, Object value, Class toType) {
// futuramente um switch para determinar o i18n
I18nSupport i18n = (I18nSupport)ActionContext.getContext().getSession().get("i18n");
return ptBR(value, toType);
}
/**
* Converte strings para datas no padrão pt_BR (português-brasil).
* @param value
* @param toType
* @return
*/
private Object ptBR(Object value, Class toType) {
int dd, mm, aaaa;
String[] d = (String[])value;
int slash1 = d[0].indexOf(SLASH);
int slash2 = d[0].lastIndexOf(SLASH);
dd = Integer.parseInt(d[0].substring(0, slash1));
mm = Integer.parseInt(d[0].substring(slash1+1, slash2));
aaaa = Integer.parseInt(d[0].substring(slash2+1));
Calendar cal = new GregorianCalendar(aaaa, mm-1, dd);
return cal.getTime();
}
/**
* Converte strings para datas no padrão en_US (english-united states).
* @param value
* @param toType
* @return
*/
private Object enUS(Object value, Class toType) {
return null;
}
/**
* Converte strings para datas no padrão es_ES (spanish-spain).
* @param value
* @param toType
* @return
*/
private Object esES(Object value, Class toType) {
return null;
}
}
Coloca um xwork-conversion.properties no CLASSPATH e pronto.
# xwork-conversion.properties
java.util.Date = br.com.atmtec.converter.DateConverter
Normalmente em um type converter vc verifica se a conversão é from ou to String. Neste caso específico da data o objeto volta como data mesmo para vc aplicar um SimpleDateFormat dependendo do i18n (ou l10n).
vou ficar mau acostumado… :oops:
Valeu pessoal… isso já é bem melhor que usar o req.get… e depois converter…

Qur falta que isso fez 6 meses atras @.@ … valeu cara 
Que tal usar String.split ao invés do protocolo SPCSPL* na hora de separar os valores?
[size=9]* String Pra Cá, String Prá Lá - by cv[/size]
Minha sugestão fica em usar o próprio SimpleDateFormat
private static final String en_US = “MM/dd/yyyy”’;
private static final String pt_BR = “dd/MM/yyyy”’;
e converter a data a partir daí…

Aproveitei a idéia e fiz assim Oó
package br.unopar.infra.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Map;
import ognl.DefaultTypeConverter;
public class DateConverter extends DefaultTypeConverter{
public static final String pt_BR_simple = "dd/MM/yyyy";
public static final String pt_BR_full = "dd/MM/yyyy HH:mm";
public Object convertValue(Map context, Object value, Class toType){
try{
String v[] = (String[]) value;
SimpleDateFormat format = null;
if(v[0].length()==16){
format = new SimpleDateFormat(pt_BR_full);
}else{
format = new SimpleDateFormat(pt_BR_simple);
}
return format.parse(v[0]);
}catch(ParseException e){
e.printStackTrace();
return null;
}
}
}
Talvez voce queira colocar um trim() na data, pra evitar falhar a comparacao com “16” (de onde veio esse numero? ;))
“dd/MM/yyyy HH:mm”.length() 
Tenho muitos campos nos meus cadastros que necessitam dessa mascara… Não preciso do trim() porque o tamanho do campo já é limitado.