[Resolvido][Vraptor] Serializar em JSON objetos do Joda Time

Olá,

Tenho uma classe que possui atributos que é do tipo da API Joda Time.
Tenho LocalTime e DateTme. Uso Hibernate Converter do Joda para Gravar no banco.

Mas quando tento listar os registros, eu recebo via getJSON, vem somente os registros que nao sao do tipo do Joda. Simplesmente os registro nao aparecem no JSON.

{"list": [{"id": 11,"situacao": "Regular","finalizado": true},{"id": 12,"situacao": "Regular","finalizado": true},{"id": 14,"situacao": "Regular","finalizado": true},{"id": 15,"situacao": "Atraso","finalizado": true},{"id": 16,"situacao": "Atraso","finalizado": true},{"id": 17,"situacao": "Atraso","finalizado": true}]}

Preciso fazer algum procedimento especial?

o vraptor só serializa por padrão os primitivos (numeros, string, date e calendar)… se vc quer serializar outros tipos de campos, vc precisa fazer:

result.use(json())....include("nomeDoCampo").serialize();
ou
result.use(json())....recursive().serialize();

mesmo assim pode ser que ele não imprima as datas do jodatime do jeito que vc quer… daí vc precisa criar um converter parecido com esse:

talvez vc tenha que implementar um converter para os tipos do joda time (é bem fácil, implemente SingleValueConverter)

[quote=Lucas Cavalcanti]o vraptor só serializa por padrão os primitivos (numeros, string, date e calendar)… se vc quer serializar outros tipos de campos, vc precisa fazer:

result.use(json())....include("nomeDoCampo").serialize();
ou
result.use(json())....recursive().serialize();

mesmo assim pode ser que ele não imprima as datas do jodatime do jeito que vc quer… daí vc precisa criar um converter parecido com esse:

talvez vc tenha que implementar um converter para os tipos do joda time (é bem fácil, implemente SingleValueConverter)
[/quote]

Valeu xará, usei o SingleValueConverter dando somente um toString o tipo do Joda e está resolvido. Valeu!.

Só unica obesevação é que a classe que estou serializando possui 8 atributo relacionado à Data e Hora. O que tronou o código um pouco feio com monte de include. Isso é de menos.

Valeu!

vc pode usar o recursive() e excludes depois se ficar melhor

[quote=Lucas Cavalcanti]o vraptor só serializa por padrão os primitivos (numeros, string, date e calendar)… se vc quer serializar outros tipos de campos, vc precisa fazer:

result.use(json())....include("nomeDoCampo").serialize();
ou
result.use(json())....recursive().serialize();

mesmo assim pode ser que ele não imprima as datas do jodatime do jeito que vc quer… daí vc precisa criar um converter parecido com esse:

talvez vc tenha que implementar um converter para os tipos do joda time (é bem fácil, implemente SingleValueConverter)
[/quote]

Lucas, como que eu uso esse SingleValueConverter, não estou conseguindo, de um exemplo ai… o nosso amigo Lucas Emanuel não postou a solução.

Obrigado.

se vc está usando o VRaptor 3.4.0, crie as classes:

@Component
public class LocalDateConverter implements SingleValueConverter {
   //implementação aqui
}

manda o toString e o fromString usarem o formato que vc quer usar.

[quote=Lucas Cavalcanti]se vc está usando o VRaptor 3.4.0, crie as classes:

@Component
public class LocalDateConverter implements SingleValueConverter {
   //implementação aqui
}

manda o toString e o fromString usarem o formato que vc quer usar.[/quote]

Obrigado lucas, deu certo agora, estou usando o VRaptor 3.3.x , fica o código ai par quem precisar:
A diferença é que estou usando o DateTime da JodaTime:

import javax.servlet.http.HttpServletResponse;
import org.joda.time.DateTime;
import br.com.caelum.vraptor.interceptor.TypeNameExtractor;
import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.serialization.ProxyInitializer;
import br.com.caelum.vraptor.serialization.xstream.XStreamJSONSerialization;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.converters.SingleValueConverter;

@Component    
public class DataConvert extends XStreamJSONSerialization {   
      
    public DataConvert(HttpServletResponse response,TypeNameExtractor extractor, ProxyInitializer initializer) {  
        super(response, extractor, initializer);  
    }  
       
    @Override  
    public XStream getXStream() {  
        XStream xstream = super.getXStream();  
        xstream.registerConverter(new SingleValueConverter() {  
        	  
			public String toString(Object value) {
    		   DateTime d = new DateTime(value);
    		   String data = d.toString("dd/MM/yy");
    		   return data;
			}  
        	  
			@SuppressWarnings("rawtypes")
			public boolean canConvert(Class clazz) {  
				return DateTime.class.isAssignableFrom(clazz);
			}  
		  
			public Object fromString(String value) {  
			return null; //não é usado  
			}  
		}); 
        
        return xstream;  
    }
    
    

Mudei para VRaptor 3.4 ficou mais simples ainda:

package com.icelula.JSON;

import org.joda.time.DateTime;
import br.com.caelum.vraptor.ioc.Component;
import com.thoughtworks.xstream.converters.SingleValueConverter;

@Component    
public class ConvertDataJSON implements SingleValueConverter  {   

	@Override
	public String toString(Object value) {
		DateTime d = new DateTime(value);
		String data = d.toString("dd/MM/yy");
		return data;
	
	}  
	 
	@SuppressWarnings("rawtypes")
	public boolean canConvert(Class clazz) {  
        return DateTime.class.isAssignableFrom(clazz);
	}

	@Override
	public Object fromString(String arg0) {
		// TODO Auto-generated method stub
		return null;
	}  
  
}  

Funcionou fácil. Valeu @joander.vieira e @Lucas Cavalcanti.