[RESOLVIDO] Problema de frozen class ao deserializar com o Restfulie

Está acontecendo esse erro ao deserializar com o Restfulie…

O mais estranho é que esse erro acontece aleatoriamente. Ou seja, se eu executar 10 vezes o código, 5 vezes dá 100% certo e 5 vezes dá errado… não achei o que pode causar o erro.

E não achei outros casos desses no Google. Alguém já passou por isso?

Erro abaixo:

[code]Exception in thread “main” com.thoughtworks.xstream.converters.ConversionException: br.com.caelum.restfulie.HistoricoExclusoes_1324647397279: frozen class (cannot edit) : br.com.caelum.restfulie.HistoricoExclusoes_1324647397279: frozen class (cannot edit)
---- Debugging information ----
message : br.com.caelum.restfulie.HistoricoExclusoes_1324647397279: frozen class (cannot edit)
cause-exception : java.lang.RuntimeException
cause-message : br.com.caelum.restfulie.HistoricoExclusoes_1324647397279: frozen class (cannot edit)
class : br.com.cauirs.xxxx.entidades.Sincronizacoes
required-type : br.com.cauirs.xxxx.entidades.HistoricoExclusoes
path : /sincronizacoes/exclusoes/excluido[2]
line number : 27

at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:89)
at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:63)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:76)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:60)
at com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter.readItem(AbstractCollectionConverter.java:71)
at com.thoughtworks.xstream.converters.collections.CollectionConverter.populateCollection(CollectionConverter.java:68)
at com.thoughtworks.xstream.converters.collections.CollectionConverter.unmarshal(CollectionConverter.java:61)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:82)
at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:63)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:76)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshallField(AbstractReflectionConverter.java:246)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:218)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:162)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:82)
at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:63)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:76)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:60)
at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:137)
at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:33)
at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:923)
at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:909)
at com.thoughtworks.xstream.XStream.fromXML(XStream.java:853)
at com.thoughtworks.xstream.XStream.fromXML(XStream.java:845)
at br.com.caelum.restfulie.mediatype.XmlMediaType.unmarshal(XmlMediaType.java:73)
at br.com.caelum.restfulie.http.apache.ApacheResponse.getResource(ApacheResponse.java:60)
at br.com.cauirs.xxxx.sincronizador.Sincronizador.puxarDadosDoOnline(Sincronizador.java:33)
at br.com.cauirs.xxxx.sincronizador.Sincronizador.puxarDadosDoOnline(Sincronizador.java:25)
at Teste.main(Teste.java:27)

Caused by: java.lang.RuntimeException: br.com.caelum.restfulie.HistoricoExclusoes_1324647397279: frozen class (cannot edit)
at javassist.ClassPool.checkNotFrozen(ClassPool.java:568)
at javassist.ClassPool.makeClass(ClassPool.java:746)
at javassist.ClassPool.makeClass(ClassPool.java:731)
at br.com.caelum.restfulie.relation.Enhancer.enhanceResource(Enhancer.java:17)
at br.com.caelum.restfulie.mediatype.XStreamHelper$EnhancedLookupProvider.newInstance(XStreamHelper.java:35)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.instantiateNewInstance(AbstractReflectionConverter.java:308)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:161)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:82)
… 27 more[/code]

o problema é que toda requisição ele tá criando um proxy diferente… pra ele não fazer isso vc precisa:

Enhancer enhancer = new CachedEnhancer(new DefaultEnhancer()); // tem que ser singleton!

//e pra criar requisições:
RestClient client = Restfulie.custom(enhancer);

//seu código

Lucas,

Vocês tem uma versão do jar da versão 1.0.1 disponível para download?
Estou com a versão 1.0.0 BETA5 e não tenho essas classes do Enhancer. Procurei no github, mas não achei o .jar

tá no maven :wink:

http://repo1.maven.org/maven2/br/com/caelum/restfulie/1.0.1/restfulie-1.0.1.jar

Valeu. Resolvido o problema.

Desculpa ressucitar o tópico, mas resolveu pra mim não. To tentando persistir a entidade via JPA, e mesmo usando a versão do jar que tá no maven, a mensagem persiste

http://repo1.maven.org/maven2/br/com/caelum/restfulie/1.0.1/restfulie-1.0.1.jar


Chamando transação no método:java.lang.IllegalArgumentException: Unknown entity: br.com.caelum.restfulie.OhLohProject_13752687256972219619085732285724
Exception in thread "main" java.lang.IllegalArgumentException: Unknown entity: br.com.caelum.restfulie.OhLohProject_13752687256972219619085732285724
	at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:878)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at org.jboss.weld.bean.proxy.AbstractBeanInstance.invoke(AbstractBeanInstance.java:46)
	at org.jboss.weld.bean.proxy.ProxyMethodHandler.invoke(ProxyMethodHandler.java:101)
	at org.jboss.weld.proxies.EntityManager$516807541$Proxy$_$$_WeldClientProxy.persist(Unknown Source)
	at br.ufba.dcc.mestrado.computacao.repository.impl.BaseRepositoryImpl.add(BaseRepositoryImpl.java:127)
	at br.ufba.dcc.mestrado.computacao.repository.impl.OhLohProjectRepositoryImpl$Proxy$_$$_WeldSubclass.add(Unknown Source)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at org.jboss.weld.interceptor.proxy.SimpleInterceptionChain.interceptorChainCompleted(SimpleInterceptionChain.java:47)
	at org.jboss.weld.interceptor.chain.AbstractInterceptionChain.invokeNextInterceptor(AbstractInterceptionChain.java:80)
	at org.jboss.weld.interceptor.proxy.InterceptorInvocationContext.proceed(InterceptorInvocationContext.java:141)
	at br.ufba.dcc.mestrado.computacao.transactions.TransactionInterceptor.manageTransaction(TransactionInterceptor.java:33)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:601)
	at org.jboss.weld.interceptor.proxy.SimpleMethodInvocation.invoke(SimpleMethodInvocation.java:30)
	at org.jboss.weld.interceptor.chain.AbstractInterceptionChain.invokeNext(AbstractInterceptionChain.java:93)
	at org.jboss.weld.interceptor.chain.AbstractInterceptionChain.invokeNextInterceptor(AbstractInterceptionChain.java:78)
	at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.executeInterception(InterceptorMethodHandler.java:48)
	at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.invoke(InterceptorMethodHandler.java:41)
	at org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler.invoke(CombinedInterceptorAndDecoratorStackMethodHandler.java:53)

Também tinha tentado usar a solução anterior e nada:

private RestClient configureRestClient() {		
	Enhancer enhancer = new CachedEnhancer(new DefaultEnhancer());		
	RestClient restfulie = Restfulie.custom(enhancer);
	return restfulie;
}

O problema é que o restfulie cria um proxy da classe para conseguir adicionar métodos com os links de hipermídia…

vc não pode mandar persistir esse proxy, pq ele não é uma entidade da jpa =(

precisaria rolar uma cópia para um objeto novo, do tipo certo.