[RESOLVIDO] Erro de "IllegalStateException" para a classe "EnhancedList" no RESTFulie  XML
Índice dos Fóruns » Frameworks e Bibliotecas brasileiros
Autor Mensagem
bland
JavaEvangelist

Membro desde: 10/12/2004 09:36:35
Mensagens: 330
Offline

Olá pessoal!

Estou novamente aqui para reportar um erro que estou encontrando quando tento executar o RESTFulie no servidor do meu cliente.

Vou contextualizar para ficar mais fácil o entendimento do erro.

Eu tenho o meu serviço no VRaptor e disponibilizo este para um cliente em RESTFulie. Até então, tudo bem. Este cliente estava executando os testes usando uma classe standalone e estava tudo certo.

Após vermos que a comunicação estava acontecendo, fizemos a "migração" deste para a aplicação propriamente dita, ou seja, incorporamos a mesma chamada (digo copy/paste) para dentro do projeto que usará o meu serviço no VRaptor (abaixo tem o exemplo do código de chamada)...

... e esta passou a dar erro no momento da recuperação do RestClient, ou seja, nessa linha:

Nem chega a registrar os tipos. Vendo que este erro passou a acontecer quando fizemos a mudança da chamada para dentro do servidor de aplicação (incorporado ao projeto propriamente dito), fizemos o teste com o standalone novamente, e esse não apresentou erro algum. O servidor de aplicação deste projeto é o Tomcat versão 5.5.

O erro apresentado é este:
10:24:42,787 ERROR DispatchActionAb:250 - Exception :Unable to extend type br.com.caelum.restfulie.mediatype.EnhancedList
java.lang.IllegalStateException: Unable to extend type br.com.caelum.restfulie.mediatype.EnhancedList
at br.com.caelum.restfulie.relation.Enhancer.enhanceResource(Enhancer.java:24)
at br.com.caelum.restfulie.mediatype.XStreamHelper.getXStream(XStreamHelper.java:120)
at br.com.caelum.restfulie.mediatype.JsonMediaType.<init>(JsonMediaType.java:33)
at br.com.caelum.restfulie.http.DefaultRestClient.<init>(DefaultRestClient.java:55)
at br.com.caelum.restfulie.Restfulie.custom(Restfulie.java:45)
at br.scmba.prontus.dispensacao.view.action.DispensacaoDispatchAction.executeWS(DispensacaoDispatchAction.java:1013)
at br.scmba.prontus.dispensacao.view.action.DispensacaoDispatchAction.salvarBaixaSolicitacao(DispensacaoDispatchAction.java:51
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 org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:270)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:187)
at org.springframework.web.struts.DelegatingActionProxy.execute(DelegatingActionProxy.java:110)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:18
at net.sf.jguard.jee.authentication.http.AccessFilter.authorize(AccessFilter.java:536)
at net.sf.jguard.jee.authentication.http.AccessFilter.doFilter(AccessFilter.java:292)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:18
at br.scmba.prontus.core.util.EncodingFilter.doFilter(EncodingFilter.java:26)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:18
at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:19
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:18
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:10
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:870)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:52
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685)
at java.lang.Thread.run(Thread.java:619)
Caused by: javassist.NotFoundException: br.com.caelum.restfulie.mediatype.EnhancedList
at javassist.ClassPool.get(ClassPool.java:436)
at br.com.caelum.restfulie.relation.Enhancer.enhanceResource(Enhancer.java:1
... 44 more

Estou com o fonte do projeto e vi que ao executar o standalone o Restfulie faz o registro corretamente da classe EnhancedList corretamente, mas não consegui entender o motivo pelo qual ele não consegue fazer o mesmo dentro do servidor de aplicação.

Se puderem me ajudar com mais esse problema, ficarei grato.

Desde então, obrigado!

Abraço!

This message was edited 1 time. Last update was at 18/02/2011 15:26:12


http://www.twitter.com/almeidafabiano

Fabiano Almeida.
[MSN]
Lucas Cavalcanti
GUJ Hacker
[Avatar]

Membro desde: 08/07/2007 00:08:14
Mensagens: 6396
Offline

onde vc está executando esse código do restfulie client?

onde está o jar do restfulie client?

o que pode estar acontecendo é que o EnnhancedList esteja em um ClassLoader diferente do do código do cliente, daí o javassist falha em conseguir carregar a classe.

--
Caelum
www.caelum.com.br

bland
JavaEvangelist

Membro desde: 10/12/2004 09:36:35
Mensagens: 330
Offline

Lucas,

De antemão, obrigado pela ajuda!

Esse código do Resfulie está dentro de um projeto que utiliza Struts, ou seja, esse código está sendo executado dentro de uma Action do Struts.

Tanto esse execução de dentro de uma Action como o standalone estão sendo executados de dentro do mesmo projeto (o desenvolvedor que está criando o cliente do meu serviço - a Action - está fazendo essa chamada como teste - o standalne) e o projeto está utilizando o Maven, ou seja, a lib do Restfulie, Javassist, etc. está tudo dentro do próprio projeto em questão. Isso responde as suas perguntas?

Essa questão do ClassLoader eu não cheguei a olhar, apesar de que o argumento é pertinente. Irei olhar agora mesmo. Mas, de antemão, caso esteja em um outro ClassLoader, o que eu poderia estar fazendo para solucionar esse erro?

Abraço!

http://www.twitter.com/almeidafabiano

Fabiano Almeida.
[MSN]
Lucas Cavalcanti
GUJ Hacker
[Avatar]

Membro desde: 08/07/2007 00:08:14
Mensagens: 6396
Offline

pode ser que exista algum jar do javassist na lib do servidor, que tem precedência...

o mesmo código no standalone funciona normalmente, é isso?

--
Caelum
www.caelum.com.br

bland
JavaEvangelist

Membro desde: 10/12/2004 09:36:35
Mensagens: 330
Offline

Lucas,

Fiz um teste e depurando vi que é exatamente isso que disse. Essa classe EnhancedList não encontra-se no ClassLoader. Na linha 2072 da classe java.lang.Class (como pode ser visto abaixo), onde o name seria br.com.caelum.restfulie.mediatype.EnhancedList está retornando null.

Estou pensando que isso pode estar ligado ao fato de estar no contexto do Tomcat e este estar se perdendo lá dentro. Tem alguma dica de como eu posso resolver esse problema?

Mais uma vez, obrigado!

http://www.twitter.com/almeidafabiano

Fabiano Almeida.
[MSN]
bland
JavaEvangelist

Membro desde: 10/12/2004 09:36:35
Mensagens: 330
Offline

Lucas,

Exatamente isso. O mesmo código, exatamente o mesmo (copy / paste), funciona perfeitamente no standalone.

Vou checar se existe essa mesma biblioteca no Tomcat.

Abraço!

http://www.twitter.com/almeidafabiano

Fabiano Almeida.
[MSN]
Lucas Cavalcanti
GUJ Hacker
[Avatar]

Membro desde: 08/07/2007 00:08:14
Mensagens: 6396
Offline

faz na sua action:


--
Caelum
www.caelum.com.br

bland
JavaEvangelist

Membro desde: 10/12/2004 09:36:35
Mensagens: 330
Offline

Lucas,

Coloquei o código que você informou na minha Action e no meu standalone.

Na Action o resultado é:
WebappClassLoader
delegate: false
repositories:
/WEB-INF/classes/
----------> Parent Classloader:
org.apache.catalina.loader.StandardClassLoader@190d8e1

WebappClassLoader
delegate: false
repositories:
/WEB-INF/classes/
----------> Parent Classloader:
org.apache.catalina.loader.StandardClassLoader@190d8e1

WebappClassLoader
delegate: false
repositories:
/WEB-INF/classes/
----------> Parent Classloader:
org.apache.catalina.loader.StandardClassLoader@190d8e1

E no meu standalone é:
sun.misc.Launcher$AppClassLoader@1a7bf11
sun.misc.Launcher$AppClassLoader@1a7bf11
sun.misc.Launcher$AppClassLoader@1a7bf11

Ou seja, para ambos os casos o ClassLoader é o mesmo. Fiquei encucado agora o porque que ele não reconhece o EnhancedList no contexto da web. Alguma outra dica?

Obrigado mais uma vez!

http://www.twitter.com/almeidafabiano

Fabiano Almeida.
[MSN]
Lucas Cavalcanti
GUJ Hacker
[Avatar]

Membro desde: 08/07/2007 00:08:14
Mensagens: 6396
Offline

no web o parent é o mesmo, mas não sei se é o mesmo classloader...

imprime o hashCode dos classloaders ou algum outro identificador único.

se ainda assim for igual, tenta criar um projeto web simples, com uma servlet, e coloca o código do restfulie dentro dessa servlet. ve se funciona

[]'s

--
Caelum
www.caelum.com.br

bland
JavaEvangelist

Membro desde: 10/12/2004 09:36:35
Mensagens: 330
Offline

Lucas,

Fiz o teste que pediu e o hashCode de todos os ClassLoader são iguais.

Dando seguimento, fiz o teste junto ao Servlet e está dando o mesmo erro listado.

Servlet:

E faço a chamada
http://localhost:8089/app/test
e o erro é o mesmo e na mesma linha.
Tem alguma outra dica?

Mais uma vez, obrigado.

Abraço!

http://www.twitter.com/almeidafabiano

Fabiano Almeida.
[MSN]
Lucas Cavalcanti
GUJ Hacker
[Avatar]

Membro desde: 08/07/2007 00:08:14
Mensagens: 6396
Offline

consegui reproduzir o bug aqui, to tentando corrigir

--
Caelum
www.caelum.com.br

Lucas Cavalcanti
GUJ Hacker
[Avatar]

Membro desde: 08/07/2007 00:08:14
Mensagens: 6396
Offline

testa com o jar que está em anexo, por favor
 Nome do arquivo restfulie-1.0.0-SNAPSHOT.jar [Disk] Download
 Descrição correção do enhancedList
 Tamanho 62 Kbytes
 Baixado:  20 vez(es)


--
Caelum
www.caelum.com.br

bland
JavaEvangelist

Membro desde: 10/12/2004 09:36:35
Mensagens: 330
Offline

Lucas,

Muito obrigado!

Problema resolvido com essa nova versão.

Abraço!

http://www.twitter.com/almeidafabiano

Fabiano Almeida.
[MSN]
 
Índice dos Fóruns » Frameworks e Bibliotecas brasileiros
Ir para:   
Powered by JForum 2.1.8 © JForum Team