Duvida Classe "generica" de Json para jqgrid, com Vraptor

1 resposta
R

Temos varias views de usuario que fazem uso de jqgrid, e este precisam de um json especifico. Para isto estamos criando classes para cada jqgrid necessario, mas muitas vezes estes são simples. vejas as classes:

@Component
public class ListaModuloJson {
    public int total;
    public int page;
    public int records;
    public List<Modulo> rows;
    private final ModuloDAO moduloDAO;
   
    public ListaModuloJson(ModuloDAO moduloDAO) {
        this.moduloDAO = moduloDAO;
    }
   
    public ListaModuloJson montaListaModuloJson() {
        this.rows = this.moduloDAO.pegaTodos();
        this.page = 1;
        this.total = (this.rows.size() / 10) + 1;
        this.records = this.rows.size();
   
        return this;
    }
}

E esta:

@Component
public class ListaTelaJson {
   
    public int total;
    public int page;
    public int records;
    public List<Tela> rows;
    private final TelaDAO telaDAO;
   
    public ListaTelaJson(TelaDAO telaDAO) {
        this.telaDAO = telaDAO;
    }
   
    public ListaTelaJson montaListaTelaJson() {
        this.rows = this.telaDAO.pegaTodos();
        this.page = 1;
        this.total = (this.rows.size() / 10) + 1;
        this.records = this.rows.size();
       
        return this;
    }
}

Tentei fazer criar uma classe generica para jqgrid, onde no construtor ele recebe no rows, a lista que quero mandar. fiz esta classe:

public class JqGrid<T> {

    public int total;
    public final int page;
    public final int records;
    public final List<T> rows;
   
    public JqGrid(List<T> rows) {
        this.rows = rows;

        this.page = 1;
        this.total = (this.rows.size() / 10) + 1;
        this.records = this.rows.size();
    }

    public int getTotal() {
        return total;
    }

    public int getPage() {
        return page;
    }

    public int getRecords() {
        return records;
    }

    public List<T> getRows() {
        return rows;
    }
}
E no controller, criaria assim:
@Get
    @Path("permissao/tela/listatela.json")
    public void buscaListaTelas() {
     
         JqGrid<Tela> jqGrid = new JqGrid<Tela>(this.telaDAO.pegaTodos());
       
        this.result.use(json()).withoutRoot().from(jqGrid).include("rows").include("rows.modulo").serialize();
    }
Estaria correto meu pensamento, em criar esta classe? Ela estaria implementada de forma correta? Ele dá este erro ao serializer o json:
Caused by: java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class
    at br.com.caelum.vraptor.serialization.xstream.XStreamSerializer.getActualType(XStreamSerializer.java:217)
    at br.com.caelum.vraptor.serialization.xstream.XStreamSerializer.include(XStreamSerializer.java:199)
    at br.com.diplomata.controllers.PermissaoController.buscaListaTelas(PermissaoController.java:41)
    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:616)
    at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:61)

1 Resposta

Lucas_Cavalcanti

o suporte a atributos genericos não foi implementado no VRaptor…

isso pq o java exclui o tipo genérico do bytecode nesse caso, então o vraptor não tem como descobrir sem olhar o campo de fato…

dá pra tentar implementar o suporte, mas o VRaptor vai precisar fazer uns chutes pra descobrir o T

Criado 28 de julho de 2011
Ultima resposta 29 de jul. de 2011
Respostas 1
Participantes 2