[resolvido] VRaptor montando JSON com List<>

Galera…

É um tópico estranho, pois tem hora que o vraptor monta certinho o JSON e funciona…
E tem hora que não… mostra ‘undefined’ na jsp…

eis o json:

{"codigo": 3,"nome": "Novo livro","autores": [true,-1,"model.entity.Livro.autores",false],"editora": {"codigo": 1,"nome": "teste"},"tags": [true,-1,"model.entity.Livro.tags",false],

O que eu fiz para serializar as collections seguindo alguns posts daqui e uns tutoriais:

package br.com.cauirs.escolafacil.infra;

import java.util.Collection;

import javax.servlet.http.HttpServletResponse;

import br.com.caelum.vraptor.interceptor.TypeNameExtractor;
import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.serialization.ProxyInitializer;
import br.com.caelum.vraptor.serialization.xstream.XStreamBuilder;
import br.com.caelum.vraptor.serialization.xstream.XStreamJSONSerialization;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.converters.collections.CollectionConverter;

/**
 * @author Washington Botelho
 * @article http://www.wbotelhos.com/2010/08/26/vraptor-3-evitando-
 *          circularreferenceexception-do-xstream
 * 
 */

@Component public class CustomJSONSerialization extends XStreamJSONSerialization {

	public CustomJSONSerialization(HttpServletResponse response, TypeNameExtractor extractor, ProxyInitializer initializer, XStreamBuilder builder) {
		super(response, extractor, initializer, builder);
	}

	@Override
	protected XStream getXStream() {
		XStream xstream = super.getXStream();

		xstream.registerConverter(new CollectionConverter(xstream.getMapper()) {
			@Override
			@SuppressWarnings("rawtypes")
			public boolean canConvert(Class type) {
				return Collection.class.isAssignableFrom(type);
			}
		});

		return xstream;
	}

}
package br.com.cauirs.escolafacil.infra;

import com.thoughtworks.xstream.XStream;

import br.com.caelum.vraptor.interceptor.TypeNameExtractor;
import br.com.caelum.vraptor.ioc.Component;
import br.com.caelum.vraptor.ioc.PrototypeScoped;
import br.com.caelum.vraptor.serialization.xstream.XStreamBuilderImpl;
import br.com.caelum.vraptor.serialization.xstream.XStreamConverters;

@PrototypeScoped
@Component
public class CustomXStreamBuilder extends XStreamBuilderImpl {

	public CustomXStreamBuilder(XStreamConverters converters, TypeNameExtractor extractor) {
		super(converters, extractor);
	}

	// delega o construtor

	public XStream configure(XStream xstream) {

		super.configure(xstream);

		xstream.aliasSystemAttribute(null, "class");

		xstream.aliasSystemAttribute(null, "resolves-to");

		return xstream;

	}

}

Na hora de montar o JSON:

		result.use(Results.json()).withoutRoot().from(obras).include("editora", "editora.nome", "tags", "autores", "tipo").serialize();

Muito estranho…
Agora a pouco estava retornando o JSON correto… Agora não está mais. Será que tem algum erro na hora de subir pro servidor?
versão do vraptor 3.4.1

JSON INCORRETO:

"autores": [true,-1,"model.entity.Livro.autores",false]

JSON CORRETO:

"autores": [{"codigo": 1,"nome": "Autor 1"}]

remova essas classes que vc criou e deixe apenas essa:

http://www.guj.com.br/java/254764-resolvido-duvida-sobre-validator-extjs-4--json--vraptor-340/5#1427839

PersistentBagConverter

Vlwww Lucas.
Resolvido.

Que tal incorporar isso no vraptor?
ou colocar um tutorial / comentário / post
lá na documentação?

é uma boa… quer fazer isso e mandar um pull request? :wink:

as páginas dos cookbooks estão no link acima

Já tem lá :frowning:

http://caelum.github.com/vraptor/cookbook

tem não

ja tem pull request

sim… mas vc pode mandar um outro seu =)

crie um fork do vraptor e adicione o arquivo lá!

daí dá pra vc mandar um pull request

sim… mas vc pode mandar um outro seu =)

crie um fork do vraptor e adicione o arquivo lá!

daí dá pra vc mandar um pull request