Problema no XStreamSerializer

9 respostas
boneazul

Olha eu aqui de novo …

Estou implementando uma classe para retornar um json especifico e estou recebendo uma exception

A classe pra gerar o json , basicamente uma lista de dados e uma contagem do total de registros encontrados

public class AutoComplete<T> {
	private Integer count;
	private List<T> list;
	public Integer getCount() {
		return count;
	}
	public void setCount(Integer count) {
		this.count = count;
	}
	public void setList(List<T> list) {
		this.list = list;
	}
	public List<T> getList() {
		return list;
	}
	
}
//Chamada usando generics
AutoComplete<ProdutoServico> autoComplete = new AutoComplete<ProdutoServico>();
autoComplete.setCount(produtoServico.size());
autoComplete.setList(produtoServico);
result.use(Results.json()).withoutRoot().from(autoComplete).include("list").serialize();
//Exception

Caused by: java.lang.ClassCastException: sun.reflect.generics.reflectiveObjects.TypeVariableImpl cannot be cast to java.lang.Class
	at br.com.caelum.vraptor.serialization.xstream.XStreamSerializer.getActualType(XStreamSerializer.java:217)
	at br.com.caelum.vraptor.serialization.xstream.XStreamSerializer.include(XStreamSerializer.java:199)

Alternativas ?

9 Respostas

Lucas_Cavalcanti

esse bug foi corrigido, mas ainda não foi lançado…

vê se com esse jar funciona, por favor:

https://oss.sonatype.org/content/repositories/snapshots/br/com/caelum/vraptor/3.4.0-SNAPSHOT/vraptor-3.4.0-20110704.175134-7.jar

boneazul

Lucas Cavalcanti:
esse bug foi corrigido, mas ainda não foi lançado…

vê se com esse jar funciona, por favor:

https://oss.sonatype.org/content/repositories/snapshots/br/com/caelum/vraptor/3.4.0-SNAPSHOT/vraptor-3.4.0-20110704.175134-7.jar

Bom parou de dar aquela exception mas agora entrou em outra do xstream agora , parece que ele não consegue serializar em cima de do método subList , estranho .

br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: com.thoughtworks.xstream.converters.reflection.ObjectAccessException: Could not get field class java.lang.reflect.Field.l : Reflection is not allowed on private java.util.AbstractList java.util.SubList.l
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:96)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:87)
	at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.jslsolucoes.erbuss.site.interceptor.AuthenticationInterceptor.intercept(AuthenticationInterceptor.java:38)
	at br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	at br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	at br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:23)
	at br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	at br.com.caelum.vraptor.ioc.guice.GuiceProvider.provideForRequest(GuiceProvider.java:81)
	at br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
	at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:35)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
	at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:58)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
	at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
	at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:122)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
	at com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:97)
	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
	at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
	at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
	at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
	at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
	at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
	at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:70)
	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
	at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:351)
	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
	at org.mortbay.jetty.Server.handle(Server.java:326)
	at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
	at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:938)
	at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755)
	at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
	at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
	at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
	at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
Caused by: com.thoughtworks.xstream.converters.reflection.ObjectAccessException: Could not get field class java.lang.reflect.Field.l : Reflection is not allowed on private java.util.AbstractList java.util.SubList.l
	at com.thoughtworks.xstream.converters.reflection.PureJavaReflectionProvider.visitSerializableFields(PureJavaReflectionProvider.java:132)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doMarshal(AbstractReflectionConverter.java:73)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.marshal(AbstractReflectionConverter.java:64)
	at com.thoughtworks.xstream.core.TreeMarshaller.convert(TreeMarshaller.java:67)
	at com.thoughtworks.xstream.core.TreeMarshaller.convertAnother(TreeMarshaller.java:59)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.marshallField(AbstractReflectionConverter.java:175)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$2.writeField(AbstractReflectionConverter.java:166)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter$2.visit(AbstractReflectionConverter.java:136)
	at com.thoughtworks.xstream.converters.reflection.PureJavaReflectionProvider.visitSerializableFields(PureJavaReflectionProvider.java:128)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doMarshal(AbstractReflectionConverter.java:106)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.marshal(AbstractReflectionConverter.java:64)
	at com.thoughtworks.xstream.core.TreeMarshaller.convert(TreeMarshaller.java:67)
	at com.thoughtworks.xstream.core.TreeMarshaller.convertAnother(TreeMarshaller.java:59)
	at com.thoughtworks.xstream.core.TreeMarshaller.convertAnother(TreeMarshaller.java:44)
	at com.thoughtworks.xstream.core.TreeMarshaller.start(TreeMarshaller.java:79)
	at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.marshal(AbstractTreeMarshallingStrategy.java:37)
	at com.thoughtworks.xstream.XStream.marshal(XStream.java:880)
	at com.thoughtworks.xstream.XStream.marshal(XStream.java:869)
	at com.thoughtworks.xstream.XStream.toXML(XStream.java:842)
	at br.com.caelum.vraptor.serialization.xstream.XStreamSerializer.serialize(XStreamSerializer.java:254)
	at br.com.jslsolucoes.erbuss.site.controller.ProdutoServicoController.search(ProdutoServicoController.java:56)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:100)
	at br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:61)
	... 60 more
Caused by: java.lang.IllegalAccessException: Reflection is not allowed on private java.util.AbstractList java.util.SubList.l
	at com.google.appengine.tools.development.agent.runtime.Runtime.verifyWhiteListed(Runtime.java:63)
	at com.google.appengine.tools.development.agent.runtime.Runtime.verifyReadable(Runtime.java:71)
	at com.google.appengine.tools.development.agent.runtime.Runtime.verifyAndRun(Runtime.java:333)
	at com.google.appengine.tools.development.agent.runtime.Runtime.get(Runtime.java:148)
	at com.thoughtworks.xstream.converters.reflection.PureJavaReflectionProvider.visitSerializableFields(PureJavaReflectionProvider.java:127)
	... 86 more

troquei por Lists.newArrayList(produtosServicos.subList(0,maxResults));

agora fica num loop infinito ate gerar uma stackOverflow , será algum bug no guava ?

at com.google.common.base.FinalizableWeakReference.<init>(FinalizableWeakReference.java:38)
	at com.google.common.collect.CustomConcurrentHashMap$WeakValueReference.<init>(CustomConcurrentHashMap.java:1297)
	at com.google.common.collect.CustomConcurrentHashMap$WeakValueReference.copyFor(CustomConcurrentHashMap.java:1308)
	at com.google.common.collect.CustomConcurrentHashMap.copyEntry(CustomConcurrentHashMap.java:1403)
	at com.google.common.collect.CustomConcurrentHashMap$Segment.removeFromTable(CustomConcurrentHashMap.java:2337)
	at com.google.common.collect.CustomConcurrentHashMap$Segment.reclaimValue(CustomConcurrentHashMap.java:2271)
	at com.google.common.collect.CustomConcurrentHashMap.reclaimValue(CustomConcurrentHashMap.java:1419)
	at com.google.common.collect.CustomConcurrentHashMap$StrongEntry.valueReclaimed(CustomConcurrentHashMap.java:816)
	at com.google.common.collect.CustomConcurrentHashMap$WeakValueReference.finalizeReferent(CustomConcurrentHashMap.java:1302)
	at com.google.common.base.FinalizableReferenceQueue.cleanUp(FinalizableReferenceQueue.java:139)
	at com.google.common.base.FinalizableWeakReference.<init>(FinalizableWeakReference.java:38)
	at com.google.common.collect.CustomConcurrentHashMap$WeakValueReference.<init>(CustomConcurrentHashMap.java:1297)
	at com.google.common.collect.CustomConcurrentHashMap$WeakValueReference.copyFor(CustomConcurrentHashMap.java:1308)
	at com.google.common.collect.CustomConcurrentHashMap.copyEntry(CustomConcurrentHashMap.java:1403)
	at com.google.common.collect.CustomConcurrentHashMap$Segment.removeFromTable(CustomConcurrentHashMap.java:2337)
	at com.google.common.collect.CustomConcurrentHashMap$Segment.reclaimValue(CustomConcurrentHashMap.java:2271)
	at com.google.common.collect.CustomConcurrentHashMap.reclaimValue(CustomConcurrentHashMap.java:1419)
	at com.google.common.collect.CustomConcurrentHashMap$StrongEntry.valueReclaimed(CustomConcurrentHashMap.java:816)
	at com.google.common.collect.CustomConcurrentHashMap$WeakValueReference.finalizeReferent(CustomConcurrentHashMap.java:1302)
	at com.google.common.base.FinalizableReferenceQueue.cleanUp(FinalizableReferenceQueue.java:139)
	at com.google.common.base.FinalizableWeakReference.<init>(FinalizableWeakReference.java:38)
Lucas_Cavalcanti

esse produtosServicos foi gerado pelo guava também?

tenta usar new ArrayList(), ao invés do Lists.newArrayList (bizarro, mas enfim)

boneazul

Lucas Cavalcanti:
esse produtosServicos foi gerado pelo guava também?

tenta usar new ArrayList(), ao invés do Lists.newArrayList (bizarro, mas enfim)

public void search(String term,Integer maxResults){
		List<ProdutoServico> produtosServicos = new ArrayList<ProdutoServico>();
		for(Produto produto : this.repositoryProduto.searchByString(term,maxResults)){
			ProdutoServico produtoServico = new ProdutoServico();
			produtoServico.setId(produto.getId());
			produtoServico.setNome(produto.getNome());
			produtoServico.setTipo("P");
			produtoServico.setSubClasse(produto.getSubClasse());
			produtosServicos.add(produtoServico);
		}
		
		for(Servico servico : this.repositoryServico.searchByString(term,maxResults)){
			ProdutoServico produtoServico = new ProdutoServico();
			produtoServico.setId(servico.getId());
			produtoServico.setNome(servico.getNome());
			produtoServico.setTipo("S");
			produtoServico.setSubClasse(servico.getSubClasse());
			produtosServicos.add(produtoServico);
		}		
		AutoComplete<ProdutoServico> autoComplete = new AutoComplete<ProdutoServico>();
                autoComplete.setCount(produtosServicos.size());
                autoComplete.setList(produtosServicos);
                result.use(Results.json()).withoutRoot().from(autoComplete).include("list").serialize();
	}

Troquei por new ArrayList mesmo, mas continua nesse loop infinito…

Lucas_Cavalcanti

esse loop infinito começa em que classe? é uma do vraptor ou da sua aplicação?

boneazul

Bom agora o bixo pegou a pilha ele começa a exception e entra em loop .

16/08/2011 01:59:50 com.google.common.base.FinalizableReferenceQueue cleanUp
GRAVE: Error cleaning up after reference.
java.lang.StackOverflowError
	at com.google.common.collect.CustomConcurrentHashMap$WeakValueReference.<init>(CustomConcurrentHashMap.java:1297)
	at com.google.common.collect.CustomConcurrentHashMap$WeakValueReference.copyFor(CustomConcurrentHashMap.java:1308)
	at com.google.common.collect.CustomConcurrentHashMap.copyEntry(CustomConcurrentHashMap.java:1403)
	at com.google.common.collect.CustomConcurrentHashMap$Segment.removeFromTable(CustomConcurrentHashMap.java:2337)
	at com.google.common.collect.CustomConcurrentHashMap$Segment.reclaimValue(CustomConcurrentHashMap.java:2271)
	at com.google.common.collect.CustomConcurrentHashMap.reclaimValue(CustomConcurrentHashMap.java:1419)
	at com.google.common.collect.CustomConcurrentHashMap$StrongEntry.valueReclaimed(CustomConcurrentHashMap.java:816)
	at com.google.common.collect.CustomConcurrentHashMap$WeakValueReference.finalizeReferent(CustomConcurrentHashMap.java:1302)
	at com.google.common.base.FinalizableReferenceQueue.cleanUp(FinalizableReferenceQueue.java:139)
	at com.google.common.base.FinalizableWeakReference.<init>(FinalizableWeakReference.java:38)
	at com.google.common.collect.CustomConcurrentHashMap$WeakValueReference.<init>(CustomConcurrentHashMap.java:1297)
	at com.google.common.collect.CustomConcurrentHashMap$WeakValueReference.copyFor(CustomConcurrentHashMap.java:1308)
	at com.google.common.collect.CustomConcurrentHashMap.copyEntry(CustomConcurrentHashMap.java:1403)
	at com.google.common.collect.CustomConcurrentHashMap$Segment.removeFromTable(CustomConcurrentHashMap.java:2337)
	at com.google.common.collect.CustomConcurrentHashMap$Segment.reclaimValue(CustomConcurrentHashMap.java:2271)
	at com.google.common.collect.CustomConcurrentHashMap.reclaimValue(CustomConcurrentHashMap.java:1419)
	at com.google.common.collect.CustomConcurrentHashMap$StrongEntry.valueReclaimed(CustomConcurrentHashMap.java:816)
	at com.google.common.collect.CustomConcurrentHashMap$WeakValueReference.finalizeReferent(CustomConcurrentHashMap.java:1302)
	at com.google.common.base.FinalizableReferenceQueue.cleanUp(FinalizableReferenceQueue.java:139)
	at com.google.common.base.FinalizableWeakReference.<init>(FinalizableWeakReference.java:38)
	at com.google.common.collect.CustomConcurrentHashMap$WeakValueReference.<init>(CustomConcurrentHashMap.java:1297)
	at com.google.common.collect.CustomConcurrentHashMap$WeakValueReference.copyFor(CustomConcurrentHashMap.java:1308)
	at com.google.common.collect.CustomConcurrentHashMap.copyEntry(CustomConcurrentHashMap.java:1403)
	at com.google.common.collect.CustomConcurrentHashMap$Segment.removeFromTable(CustomConcurrentHashMap.java:2337)
	at com.google.common.collect.CustomConcurrentHashMap$Segment.reclaimValue(CustomConcurrentHashMap.java:2271)
	at com.google.common.collect.CustomConcurrentHashMap.reclaimValue(CustomConcurrentHashMap.java:1419)
	at com.google.common.collect.CustomConcurrentHashMap$StrongEntry.valueReclaimed(CustomConcurrentHashMap.java:816)
	at com.google.common.collect.CustomConcurrentHashMap$WeakValueReference.finalizeReferent(CustomConcurrentHashMap.java:1302)
	at com.google.common.base.FinalizableReferenceQueue.cleanUp(FinalizableReferenceQueue.java:139)
	at com.google.common.base.FinalizableWeakReference.<init>(FinalizableWeakReference.java:38)

Só pra informação estou utilizando o vraptor no GAE .

Lucas_Cavalcanti

se vc tira o include(“list”) funciona?

boneazul

Funciona

Lucas_Cavalcanti

tenta trocar o include(“list”) por .serialize().

o que pode estar acontecendo é que o VRaptor pra conseguir excluir os fields não primitivos ele passa elemento por elemento da lista, pra saber qual é o tipo… e com isso ele pode estar mandando excluir um elemento, e mandando colocar várias vezes…

seria bom tentar isolar esse caso pra poder testar e corrigir

Criado 14 de agosto de 2011
Ultima resposta 15 de ago. de 2011
Respostas 9
Participantes 2