Serialização Includes de collections Vraptor3

8 respostas
mario.fts

Bom dia

Existe alguma maneira de excluir/incluir campos em uma collection dentro de um wrapper, na serialização do Vraptor? To fazendo isso pra não ter que ficar serializando na mão pra exibir dentro de uma grid do extjs.

Exemplo:
@Component
public class ExtJSListRenderer implements View {

	private Result result;

	public ExtJSListRenderer(Result result) {
		this.result = result;
	}

	public static class ExtWrapper {
		private int total;
		private List rows;

		public ExtWrapper(List<?> objects) {
			this.rows = objects;
			this.total = objects.size();
		}

	}

	public Serializer from(List<?> objects) {
		return this.result.use(json()).withoutRoot().from(new ExtWrapper(objects)).recursive();
	}

	// para fazer import statico
	public static Class<ExtJSListRenderer> extJsList() {
		return ExtJSListRenderer.class;
	}
}
código no controller:
result.use(extJsList()).from(clienteList).exclude("nomePrincipal","nomeFantasia").serialize();

Desse jeito não funciona, testei colocando "rows.nomePrincipal" e tbm não foi. Pra resolver momentaneamente eu criei uma classe ClienteView, só com os campos q eu quero mostrar, mas isso não vai funcionar se cada tela exibir campos diferentes, vou ter que ficar criando vários ClienteView, e não quero ficar fazendo isso.

Sugestões?

[]'s

8 Respostas

Lucas_Cavalcanti

tenta excluir com “extWrapper.rows.nomePrincipal”

mario.fts

Nop. Mesma coisa.

Quando vc usa o exclude, ele só não retira o campo. Quando vc usa o include, da uma exception no serializador

java.lang.IllegalArgumentException: Field path extWrapper.rows.nomePrincipal doesn't exist
	br.com.caelum.vraptor.serialization.xstream.XStreamSerializer.include(XStreamSerializer.java:195)

Pelo que eu pude perceber, na hora q ele pega o campo rows, ele vem com o tipo List, e da o erro pq list não tem esse campo realmente, só o objeto de dentro da list é que tem.

Qual classe que tem o serializador de collections utilizado por padrão? Eu poderia sobreescrever alguns métodos do XStreamJSONSerialization com o código do serialziador de collections, pq ele faz esse comportamento para cada iten da lista.

[]'s

Lucas_Cavalcanti

vc pode fazer os excludes via anotações do xstream tb…

mario.fts

Lucas Cavalcanti:
vc pode fazer os excludes via anotações do xstream tb…

Sim, mas ai eu caio no mesmo problema de mudar os campos a serem exibidos dependendo da view.

Já estou com algumas idéias, mais tarde eu volto a ver isso, por enquanto vou resolvendo com o wrapper só com os campos q eu quero mostrar.

valeu!

G

Não sei se estou falando besteira, mas o XStream lê por getter, property ou field? Nesse caso não deveria ter um getRows para que o XStream consiga fazer o include?

Lucas_Cavalcanti

por padrão ele lê por field… mas dá pra configurar pra ele usar getters

mario.fts

os dados estão sendo gerados no jsons em problemas, desde que eu inclua a chamada a recursive(), senão sai só o total.

Lucas_Cavalcanti

é que por padrão o vraptor só adiciona tipos primitivos (String, números e datas), e vc tem uma lista… só adicionar a lista talvez funcione tb:

...include("rows")
Criado 17 de maio de 2010
Ultima resposta 17 de mai. de 2010
Respostas 8
Participantes 3