[Resolvido] EJB 2.1 - ClassCastException: $Proxy758 cannot be cast to javax.ejb.EJBLocalHome

Bom dia pessoal,

Estou com um erro em um sistema, e, não consigo identificar a causa.

O sistema é antigo (uns 13 anos, estimo), construído ainda com EJB 2.1. Atualmente, ele está em produção, rodando em um servidor de aplicação proprietário. Foi iniciado um projeto para migrar este sistema para o JBoss 5.1, e, foi aí que a dor de cabeça começou.

O sistema possui vários módulos, publicados dentro de um EAR chamado tekkrom.ear.

Um destes módulos, BuscaTipos, está dando problemas, e não consigo achar a causa.

O ejb-jar.xml é

[code]<?xml version="1.0" encoding="UTF-8"?>

BuscaTipos BuscaTipos br.com.tekkrom.util.tipos.BuscaTiposHome br.com.tekkrom.util.tipos.BuscaTipos br.com.tekkrom.util.tipos.BuscaTiposLocalHome br.com.tekkrom.util.tipos.BuscaTiposLocal br.com.tekkrom.util.tipos.BuscaTiposBean Stateless Container BuscaTipos * NotSupported [/code]

O arquivo jboss.xml foi criado desta forma:

[code]<?xml version="1.0" encoding="UTF-8"?>

BuscaTipos BuscaTipos ejb/BuscaTipos local/BuscaTipos [/code]

Há uma chamada para a interface na classe ImovelDelegateBean.java, da seguinte forma:

public void setSessionContext(SessionContext sessionContext) { this.sessionContext = sessionContext; try { ... (outras chamadas) buscaTiposLocal = ((BuscaTiposLocalHome) ServiceLocator.getInstance().getLocalHome("java:comp/env/ejb/BuscaTipos", BuscaTiposLocalHome.class)).create(); ... (outras chamadas) } catch (Exception e) { throw new EJBException("ImovelFacade.setSessionContext: Erro setando contexto inicial\n",e); } }

Porém, esta linha me retorna a seguinte exceção:

[code]2011-06-07 14:31:15,031 ERROR [org.jboss.ejb.plugins.LogInterceptor] (http-10.6.7.54-8080-8) EJBException in method: public abstract br.com.tekkrom.modulo.delegate.imovel.ImovelDelegate br.com.tekkrom.modulo.delegate.imovel.ImovelDelegateHome.create() throws javax.ejb.CreateException,java.rmi.RemoteException, causedBy:
javax.ejb.EJBException: ImovelFacade.setSessionContext: Erro setando contexto inicial

at br.com.tekkrom.modulo.delegate.imovel.ImovelDelegateBean.setSessionContext(ImovelDelegateBean.java:117)
at org.jboss.ejb.StatelessSessionEnterpriseContext.<init>(StatelessSessionEnterpriseContext.java:72)
at org.jboss.ejb.plugins.StatelessSessionInstancePool.create(StatelessSessionInstancePool.java:49)
at org.jboss.ejb.plugins.AbstractInstancePool.get(AbstractInstancePool.java:179)
at org.jboss.ejb.plugins.StatelessSessionInstanceInterceptor.invokeHome(StatelessSessionInstanceInterceptor.java:94)
at org.jboss.ejb.plugins.CallValidationInterceptor.invokeHome(CallValidationInterceptor.java:56)
at org.jboss.ejb.plugins.AbstractTxInterceptor.invokeNext(AbstractTxInterceptor.java:125)
at org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions(TxInterceptorCMT.java:350)
at org.jboss.ejb.plugins.TxInterceptorCMT.invokeHome(TxInterceptorCMT.java:161)
at org.jboss.ejb.plugins.SecurityInterceptor.process(SecurityInterceptor.java:230)
at org.jboss.ejb.plugins.SecurityInterceptor.invokeHome(SecurityInterceptor.java:205)
at org.jboss.ejb.plugins.security.PreSecurityInterceptor.process(PreSecurityInterceptor.java:99)
at org.jboss.ejb.plugins.security.PreSecurityInterceptor.invokeHome(PreSecurityInterceptor.java:88)
at org.jboss.ejb.plugins.LogInterceptor.invokeHome(LogInterceptor.java:132)
at org.jboss.ejb.plugins.ProxyFactoryFinderInterceptor.invokeHome(ProxyFactoryFinderInterceptor.java:107)
at org.jboss.ejb.SessionContainer.internalInvokeHome(SessionContainer.java:639)
at org.jboss.ejb.Container.invoke(Container.java:1046)
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.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:157)
at org.jboss.mx.server.Invocation.dispatch(Invocation.java:96)
at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:668)
at org.jboss.invocation.local.LocalInvoker$MBeanServerAction.invoke(LocalInvoker.java:169)
at org.jboss.invocation.local.LocalInvoker.invoke(LocalInvoker.java:118)
at org.jboss.invocation.InvokerInterceptor.invokeLocal(InvokerInterceptor.java:209)
at org.jboss.invocation.InvokerInterceptor.invoke(InvokerInterceptor.java:195)
at org.jboss.proxy.TransactionInterceptor.invoke(TransactionInterceptor.java:61)
at org.jboss.proxy.ejb.SecurityContextInterceptor.invoke(SecurityContextInterceptor.java:64)
at org.jboss.proxy.SecurityInterceptor.invoke(SecurityInterceptor.java:68)
at org.jboss.proxy.ejb.HomeInterceptor.invoke(HomeInterceptor.java:184)
at org.jboss.proxy.ClientContainer.invoke(ClientContainer.java:101)
at $Proxy1190.create(Unknown Source)
at br.com.tekkrom.usecase.imovel.action.CadastraImovelAction.criaImovelDelegate(CadastraImovelAction.java:173)
at br.com.tekkrom.usecase.imovel.action.CadastraImovelAction.atribuiTipos(CadastraImovelAction.java:221)
at br.com.tekkrom.usecase.imovel.action.CadastraImovelAction.executeInicio(CadastraImovelAction.java:2010)
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 br.com.tekkrom.util.struts.TekkromAction.execute(TekkromAction.java:310)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92)
at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:598)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Thread.java:619)

Caused by: ## ServiceLocator.getLocalHome: Erro ao retornar a interface local: java:comp/env/ejb/BuscaTipos
Causa: $Proxy758 cannot be cast to javax.ejb.EJBLocalHome
at br.com.tekkrom.util.ServiceLocator.getEjbLocalHome(ServiceLocator.java:91)
at br.com.tekkrom.util.ServiceLocator.getLocalHome(ServiceLocator.java:76)
at br.com.tekkrom.modulo.delegate.imovel.ImovelDelegateBean.setSessionContext(ImovelDelegateBean.java:102)
… 69 more
Caused by: java.lang.ClassCastException: $Proxy758 cannot be cast to javax.ejb.EJBLocalHome
at br.com.tekkrom.util.ServiceLocator.getEjbLocalHome(ServiceLocator.java:85)
… 71 more[/code]

Chamada no ServiceLocator:

public EJBLocalHome getEjbLocalHome(String jndiName) throws ServiceLocatorException { try { if (!homeCache.containsKey(jndiName)) { EJBLocalHome home = (EJBLocalHome) context.lookup(jndiName); homeCache.put(jndiName, home); } return (EJBLocalHome) PortableRemoteObject.narrow(homeCache.get(jndiName), EJBLocalHome.class); } catch (Exception e) { throw new ServiceLocatorException("## ServiceLocator.getLocalHome: Erro ao retornar a interface local: "+jndiName,e); } }

Não possuo nenhuma experiência prévia com EJB 2.1, apenas (um pouco) com EJB 3.0 (que saudade…). O arquivo ejb-jar.xml está idêntico ao que está em produção hoje, apenas criei o arquivo jboss.xml, seguindo tutoriais que encontrei na internet. Não fiz também nenhuma alteração em fontes.

Como o sistema está em produção hoje, creio que estou errando alguma coisa no mapeamento, mas, não consigo identificar o que seria. Outro ponto, outros módulos EJB estão funcionando já migrados para o JBoss, então tenho certeza que não há problemas com meu datasource ou com o acesso ao banco de dados (embora creio que isso não está relacionado ao erro).

Alguém já passou por este problema, ou sabe qual pode ser a causa?

Obrigada.

Boa tarde povo!

Problema resolvido, com a ajuda do Daniel Quirino! E, repitam comigo: nunca mais irei assumir que um fonte/configuração está certo, só porque o sistema está em produção! É sério. ¬¬’

O que estava errado não era no módulo que postei, e sim no outro, o que acessa. O ejb-jar dele estava assim:

... <ejb-local-ref> <ejb-ref-name>ejb/BuscaTipos</ejb-ref-name> <ejb-ref-type>Session</ejb-ref-type> <local-home>br.com.tekkrom.util.tipos.BuscaTiposLocalHome</local-home> <local>br.com.tekkrom.util.tipos.BuscaTiposLocal</local> </ejb-local-ref> ...

Usando o mesmo nome, BuscaTipos, para referência local (ou seja, as referências local e remota estavam com o mesmo nome)! Bastou mudar o nome do ejb-ref (no caso, to tentando colocar um padrão *Local) da seguinte forma:

<ejb-local-ref> <ejb-ref-name>ejb/BuscaTiposLocal</ejb-ref-name> <ejb-ref-type>Session</ejb-ref-type> <local-home>br.com.tekkrom.util.tipos.BuscaTiposLocalHome</local-home> <local>br.com.tekkrom.util.tipos.BuscaTiposLocal</local> <ejb-link>BuscaTipos</ejb-link> </ejb-local-ref>

E, no caso, acrescentei também a tag ejb-link, e tudo está funcionando (nessa parte claro, tenho outros erros no sistema a tratar).

Ah, e fica a dica: eu só descobri isso analisando o JNDI View (menu jxm-console, na página inicial do JBoss, normalmente: http://localhost:8080/jmx-console)