VRaptor - Serealizar HashMap

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