Vraptor 3: Como formatar um tipo Date no JSON [RESOLVIDO]

Olá pessoal, eu encontrei esse tópico aqui no guj:
http://www.guj.com.br/java/246468-vraptor-como-formatar-datas-em-um-json

ai eu implementei o código sugerido pelo Lucas:

@Component
public class CustomJSONDateSerialization extends XStreamJSONSerialization {   
    
  public CustomJSONDateSerialization(HttpServletResponse response,TypeNameExtractor extractor, ProxyInitializer initializer, XStreamBuilder builder) {  
      super(response, extractor, initializer, builder);
  }
     
  @Override  
  public XStream getXStream() {
      XStream xstream = super.getXStream();
      xstream.registerConverter(new DateConverter("dd/MM/yyyy", new String[0]));
      return xstream;
  }
}

porém não deu certo, a data continua no seguinte formato:
data:{’@class’:“sql-date”, $:“2012-01-01”} ou então dataCad:{’@class’:“sql-timestamp”, $:“2012-07-30 17:31:28.204”}

alguém saberia me dizer o que estou fazendo de errado ???

não sei se faz diferença, mas estou usando o vraptor 3.4.1 e hibernate 4.1.1

[]'s

deve ser pq o objeto não é um Date… é um java.sql.Date ou algo do tipo…

mas deveria funcionar pq esse tipo estende java.util.Date.

Já pensou em usar o joda-time pra isso?

então lucas, na verdade não…

você teria alguma documentação ou exemplo de como seria para resovler isso com o joda-time ???

[]'s

http://joda-time.sourceforge.net/contrib/hibernate/userguide.html

dá uma olhada aqui… tem um tipo pra data (LocalDate) e um pra data e hora (DateTime ou LocalDateTime)… alem de ter uma API bem melhor pra fazer operações com essas datas.

e pra converter, crie converters do XStream:

@Component
public class LocalDateConverter implements SingleValueConverter {
   //fromString pode deixar em branco

   public boolean canConvert(Class type) {
       return LocalDateConverter.class.isAssignableFrom(type);
   }
   public String toString(Object object) {
       LocalDate date = (LocalDate) date;
       return date.toString("dd/MM/yyyy");
   }

}

e o equivalente pros outros tipos.

lucas, o joda-time hibernate não é compatível com o hibernate 4.

na página do projeto fala para usar um tal de UserType
http://usertype.sourceforge.net/index.html

sabe me dizer se é isso mesmo ???

e outra pergunta, fora usar o joda-time, aquela solução de criar a classe que estende de XStreamJSONSerialization não seria melhor ???

[]'s

sim, vc pode usar esse customJSONSerialization… mas vc disse que não funcionou.

nas últimas versões do vraptor é melhor criar o converter do xstream anotado, que o vraptor já registra…

vc pode fazer essa solução que eu dei do joda-time, aplicando pro Date que vc tá usando nas suas classes… só mudar o canConvert e o toString.

Lucas,

fiz um teste tentando a abordagem do customJSONSerialization como seguinte código:

@Component
public class CustomJSONSerialization extends XStreamJSONSerialization {  

	public CustomJSONSerialization(HttpServletResponse response,TypeNameExtractor extractor, ProxyInitializer initializer, XStreamBuilder builder) {  
		super(response, extractor, initializer, builder);  
	}  

	@Override  
	public XStream getXStream() {  
		XStream xstream = super.getXStream();  
		xstream.registerConverter(new SingleValueConverter() {
			@Override
			public boolean canConvert(Class arg0) {
				return Date.class.isAssignableFrom(arg0);
			}
			
			@Override
			public String toString(Object date) {
				return new SimpleDateFormat("dd/MM/yyyy").format(value);
			}
			
			@Override
			public Object fromString(String arg0) {
				return null;
			}
		});
		return xstream;  
	}
}

ele esta convertendo a data para o formato que eu quero, porém o JSON esta ficando meio estranho:

[{seqLan:1, data:{'@class':"sql-date", $:"01/01/2012"}, vallimite:1, ativo:true, userCad:"a", dataCad:{'@class':"sql-timestamp", $:"30/07/2012"}, userLan:"a", dataLan:{'@class':"sql-timestamp", $:"01/08/2012"}, versao:1}, {seqLan:2, data:{'@class':"sql-date", $:"02/02/2012"}, vallimite:2, ativo:true, userCad:"a", dataCad:{'@class':"sql-timestamp", $:"01/08/2012"}, userLan:"a", dataLan:{'@class':"sql-timestamp", $:"01/08/2012"}, versao:1}]

ali onde aparece data:{’@class’:“sql-date”, $:“01/01/2012”} não deveria ser somente data:“01/01/2012” ???

[]'s

Depois muito procurar achei a seguinte solução:

xstream.addDefaultImplementation(java.sql.Date.class, java.util.Date.class);

coloquei esse código na classe CustomJSONSerialization que esta acima.

resta saber agora se esta é a forma mais correta.

[]'s

tem outra solução:

xstream.aliasSystemAttribute(null, "class");

o que acontece é que qdo o atributo é de um tipo, mas o objeto que tá guardado é de outro, ele coloca um atributo class pra indicar isso… e não é o caso que vc quer.

Lucas,

muito obrigado pela ajuda.

[]'s