Pessoal, o Vraptor serializa HashMaps ??
Exemplo:
List<HashMap<String, String>> data = new ArrayList<HashMap<String, String>>();
for (NegociacaoItens negociacaoItens : itens) {
String filial = negociacaoItens.getFilial();
HashMap<String, String> mapa = new HashMap<String, String>();
mapa.put("cod_item",negociacaoItens.getItem().getCodigo());
mapa.put("dsc_item", negociacaoItens.getItem().getNome());
mapa.put("vlr_negociado",negociacaoItens.getValorNegociado());
mapa.put("vlr_fechado",negociacaoItens.getValorFechado());
mapa.put("qtde_" + filial,negociacaoItens.getQtde());
mapa.put("vlr_total_item_" + filial,negociacaoItens.getValorTotalItem());
mapa.put("dta_entrega_" + filial, negociacaoItens.getDataEntrega());
mapa.put("dta_embarque_" + filial, negociacaoItens.getDataEmbarque());
mapa.put("cod_ccusto_" + filial, negociacaoItens.getCcusto());
data.add(mapa);
}
return data;
E no controller ( o data que contém o HashMap)
this.result.use(Results.json()).withoutRoot()
.from(extJsGridFiliais.geraColumns()).include("success")
.include("metaData").include("metaData.fields")
.include("metaData.columns")
.include("metaData.columns.columns")
.include("data")
.serialize();
Obrigado
Teoricamente o XStream (que o vraptor usa) consegue serializar mapas sim. O que aparece?
Então dá esse erro…
java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl cannot be cast to java.lang.Class
Pra teste eu coloquei apenas um só pra serializar
HashMap<String, String> mapa = new HashMap<String, String>();
mapa.put("dsc_item", negociacaoItens.getItem().getNome());
A classe que eu serializo é …
public class ExtJsGridColumns {
private Boolean success;
private ExtJsColumnsMetaData metaData;
private List<HashMap<String, String>> data;
...
Eu tirei agora o List do data e funcionou mas não é o que eu gostaria que gerasse no Json…
,“data”: [[“cod_item”,1],[“vlr_total_item_0001”,“25.00”],[“qtde_0001”,“5.00000”],[“dta_entrega_0001”,“03/11/2011”],[“vlr_fechado”,“5.00000”],[“vlr_negociado”,“17.00000”] … etc ]
Precisaria que fosse assim “data” : [{“cod_item” : 1, "vlr_total_item_0001 : 25 …}]
Não posso fazer uma classe com esses campos por que eles são gerados dinamicamente pro grid… O que fazer??
Obrigado
ao invés de fazer isso, é mais tranquilo escrever um converter pra NegociacaoItens que serializa do jeito que vc quer…
vc tá com o VRaptor mais novo?
Estou com a versão mais nova sim… é que o seguinte. A NegociacaoItens não tem os nomes dos campos iguais ao que estou serilizando… só quando vou salvar que la no próprio javascript eu ajeito e mando pro negociacaoitens…
Mas de qualquer forma estou fazendo de outro jeito. Mandando a negociacaoItens e la no javascript lendo todos os dados e “jogando” pra coluna correspondente do grid.
Obrigado.
então, criando um converter do XStream vc consegue fazer isso facilmente:
@Component
public class NegociacaoItens implements Converter { //do XStream
public boolean canConvert(Class type) {
return NegociacaoItens.class.isAssignableFrom(type);
}
public void unmarshall(...) { em branco}
public void marshalll(Object obj, HSWriter writer, XX...) {
NegociacaoItens itens = (NegociacaoItens) obj;
writer.startNode("cod_item");
writer.setValue(negociacaoItens.getItem().getCodigo());
writer.endNode();
....
}
}
se for um tipo complexo, use o context.convertAnother.
Assim fica mais fácil =)
Valeu Lucas… vou tentar dessa forma aí… Obrigado