Boa Tarde,
Estou com problemas para serializar uma lista do tipo GENERIC com o VRAPTOR 3.4, pesquisei muito em vários fóruns e não consegui achar solução
Classe Genérica
public class PagerGeneric<T> {
private Long totalRows;
private List<T> elementos;
....
Tentei serializar assim:
PagerGeneric<Pessoa> pagerPessoa = pessoaService.listarPessoaPaginado(start, limit, page);
result.use(json()).from(pagerPessoa)
.include("elementos")
.include("elementos.familia")
.serialize();
Da o seguinte exception:
java.lang.IllegalArgumentException: Field path elementos.familia doesn't exist
A classe pessoa
public class Pessoa {
...
private Familia familia;
...
}
tentei sem o generic desse forma, e deu certo.
public class PagerGeneric {
private Long totalRows;
private List<Pessoa> elementos;
....
se você usar o .recursive() (sem os includes) funciona?
o problema é que se o tipo é genérico, o some em tempo de execução, daí o vraptor não consegue navegar pelos atributos
[quote=Lucas Cavalcanti]se você usar o .recursive() (sem os includes) funciona?
o problema é que se o tipo é genérico, o some em tempo de execução, daí o vraptor não consegue navegar pelos atributos[/quote]
Com recursive funciona, mas o problema é que da CircularReferenceException, porque o atributo “elementos” é uma lista de Pessoa e o atributo “elementos.familia.membrosFamilia” também é uma lista de Pessoa.
Para resolver o problema eu tenho que excluir um atributo como abaixo:
Preciso excluir esse atributo:
result.use(json()).from(pagerPessoa)
.recursive()
.exclude("elementos.familia.membrosFamilia")
Mas ai se eu dar um exclude como acima, acontece esse exception :
Caused by: java.lang.NullPointerException
at br.com.caelum.vraptor.serialization.xstream.XStreamSerializer.getParentType(XStreamSerializer.java:116)
at br.com.caelum.vraptor.serialization.xstream.XStreamSerializer.getParentTypesFor(XStreamSerializer.java:103)
at br.com.caelum.vraptor.serialization.xstream.XStreamSerializer.exclude(XStreamSerializer.java:87)
at com.icelula.controller.ExtjsPaginasController.extjsJSON(ExtjsPaginasController.java:57)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:61)
Lembrando que não é nada com meu atributo membrosFamilia, porque esse mesmo codigo funciona direitinho sem o Generics, mas eu não posso sair criando uma Classe Pager pra cada vez que eu precisar no meu sistema, que no meu caso são muitos.
Como excluir esse atributo da serialização usando o Generics ?
o VRaptor não tem como descobrir qual é esse tipo T em tempo de execução, então ele não consegue incluir ou excluir atributos da classe…
o que vc pode fazer é criar um converter do XStream pra classe que está dando problemas.
@Component
public class FamiliaConverter implements Converter { //do XStream
canConvert ==> se for familia
unmarshal ==> não precisa implementar
marshal(obj, writer, ctx) {
Familia familia = (Familia) obj;
//para cada atributo:
writer.startNode("nomeDoAtributo");
writer.setValue(familia.getNomeDoAtributo());
writer.endNode();
}
}
se for um atributo complexo, tem um ctx.lookupConverterFor(classe) ou algo do tipo que vc pode usar pra setar o valor.