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();