TomCat chamando EJB do JBoss

Oi gente, faz umas horas que to tentando aqui e ainda não consegui fazer o tomcat chamar um ejb que está rodando no JBoss

o método que eu estou usarndo para obter a referencia:

meus imports:

import java.util.Properties;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;
import neg.AcaoRemota;

métodos:

public AcaoRemota getAcaoRemota(String host, String nome) {

        Context jndiContexto = getIntialContext(host);
        Object referencia;
        try {
            referencia = jndiContexto.lookup(nome);

            return (neg.AcaoRemota) PortableRemoteObject.narrow(referencia, neg.AcaoRemota.class);
        } catch (NamingException ex) {
          ex.printStackTrace();
        }
        return null;
    }

    private Context getIntialContext(String host) {
        Properties p = new Properties();
        p.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
        p.put(Context.URL_PKG_PREFIXES, "org.jboss.naming:org.jnp.interfaces");
        p.put(Context.PROVIDER_URL, host);
        try {
            return new javax.naming.InitialContext(p);
        } catch (NamingException ex) {
            System.out.println("Erro ");
            ex.printStackTrace();
            return null;
        }
    }

adicionei os seguintes JARs ao classpath da minha app do tomcat:

jboss-loggin-spi.jar
jbossall-client.jar
jnp-client.jar

mas estou recebendo o seguinte erro ao chamar o metodo getAcaoRemota:

java.lang.ClassCastException: javax.naming.Reference cannot be cast to org.omg.CORBA.Object
at com.sun.corba.se.impl.javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:212)
at javax.rmi.PortableRemoteObject.narrow(PortableRemoteObject.java:137)
at mb.EJBFactory.getAcaoRemota(EJBFactory.java:28)
at mb.MBPrincipal.cadastrar(MBPrincipal.java:30)
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.el.parser.AstValue.invoke(AstValue.java:172)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
at org.apache.jasper.el.JspMethodExpression.invoke(JspMethodExpression.java:68)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
at javax.faces.component.UICommand.broadcast(UICommand.java:387)
at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:321)
at org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:296)
at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:253)
at org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:466)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:849)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:454)
at java.lang.Thread.run(Thread.java:619)

jah vasculhei o google … e nao consegui achar :frowning:

muita gente tem esse problema mas ninguem dá uma resposta q funcione :frowning:

obs: esse código aí funciona em uma aplicação JavaSE normalmente. :slight_smile:

obrigadoo

Então, duas perguntas:

O jboss e o tomcat estão na mesma maquina?
Caso não estejam, a versão da JVM nessas maquinas é a mesma?

sim, estão na mesma máquina

Cara, tenta fazer o cast diretamente:

 return (neg.AcaoRemota) referencia;  

Em EJB3 eu nem uso o narrow.

Qual versao do JBoss vc usa?
O bean é stateful ou stateless?

Abraços.

desculpe se eu estiver errado, mas eu acho que vc não viu que eu tambem usei o método narrow

o bean é stateless :slight_smile:

brigado :slight_smile:

hehe na verdade vi só no meu segundo post que usava esse método, por isso sugeri que tentasse o cast diretamente.
A proposito, qual a função, alem de cast, desse metodo narrow?

po, boa pergunta kkk

depois eu vejo se encontro o que EXATAMENTE ele faz

sempre vi esse trecho como o conjunto da obra kkk sem pensar no todo rsrs

mas facin a gente acha :slight_smile:

e quando ao meu problema? mais alguma ideia?

Tenho certeza que o problema é no narrow, a exception diz tudo: cast de tipos diferentes, dai o ClassCastException.
Ainda acho válida a idéia de tentar o cast diretamente.

O que pode estar acontecendo é ter versões diferentes das libs, de repente a implementação mudou bastante de uma para a outra, sei lá, sinceramente agora to chutando =Z

Vou procurar coisas do narrow aqui.

ahh tahh foi mal , agora que eu entendi o que vc quis dizer com cast direto kk

vo tenta aki, mas acho q a possibilidade é remota (opa RMI rs) rsrs

Olha só, da uma olhada nisso:
http://java.sun.com/j2se/1.4.2/docs/api/javax/rmi/PortableRemoteObject.html#narrow(java.lang.Object,%20java.lang.Class)

E nisso:

http://devgrok.blogspot.com/2009/06/classcastexception-with.html

narrow - Checks to ensure that an object of a remote or abstract interface type can be cast to a desired type.

parece q é um instanceof :S talvez um instanceof++

[quote=javando]narrow - Checks to ensure that an object of a remote or abstract interface type can be cast to a desired type.

parece q é um instanceof :S talvez um instanceof++[/quote]
Foi exatamente o que pensei, antes de dar um cast ele testa com instanceof.
Mas que diferença faz se da o ClassCastException do mesmo jeito? huauhauhauhaa

ps: adorei aquela piada da possibilidade remota (RMI) UAUHAuhAHUAUHa isso é que é começar bem o ano hahahha.
ps2: definitivamente esse não é o tipo de piada que contarei aqui em casa =(

pelo o q eu entendi o cara tah dizendo que usando esse metodo manual pode ser que o cliente chame um ejb 3 esperando que seja um ejb 2

e ele fez uma bela duma gambi rsrs pra poder chamar um ejb 3 com esse metodo …

esse problema não ocorre quando o ejb é injetado via @EJB

mas eu nao consegui usar essa anotation na aplicação do tomcat

deve ter um jeito mais decente de chamar um ejb no tomcat

até mesmo sem usar essas coisas feias ai, de lookup narrow e afins … só resta saber como rsrs

E o cast direto? :smiley:

Precisa mesmo do narrow?

putz, tava vendo uns baralho aki kkk esqci do cast kk

vo testa

me retornou asim:

java.lang.ClassCastException: javax.naming.Reference cannot be cast to neg.AcaoRemota

ou seja,
a linha

referencia = jndiContexto.lookup(nome);

colocou na referencia um objeto javax.naming.Reference e nao um objeto AcaoRemota

o narrow deve fazer a conversão da referencia em objeto ai a gente pega esse objeto e dah o cast, como ta la


Creio que esta exceção ocorreu porque o container não conseguiu localizar seu proxy stub, por isso tentou fazer um cast para Corba Object pelo fato de vc estar usando uma inteface remota.... 
Quando vc subir sua aplicação no jboss vc pode acessar o jmx-console e verificar se o seu bean de sessão está associado a um nome no link JNDIView...

Creio que esta exceção ocorreu porque o container não conseguiu localizar seu proxy stub, por isso tentou fazer um cast para Corba Object pelo fato de vc estar usando uma inteface remota…
Quando vc subir sua aplicação no jboss vc pode acessar o jmx-console e verificar se o seu bean de sessão está associado a um nome no link JNDIView…

[quote=breno500as]java.lang.ClassCastException: javax.naming.Reference cannot be cast to org.omg.CORBA.Object

Creio que esta exceção ocorreu porque o container não conseguiu localizar seu proxy stub, por isso tentou fazer um cast para Corba Object pelo fato de vc estar usando uma inteface remota…
Quando vc subir sua aplicação no jboss vc pode acessar o jmx-console e verificar se o seu bean de sessão está associado a um nome no link JNDIView…[/quote]

sim, está la registrado tanto é que a minha aplicação javaSE acessa

Em vez de usar o Portable faz assim então:

Se o seu bean estiver registrado corretamente não vai dar erro… Mas creio que vc vai ver que sua exceção vai mudar para algo parecido com isso aqui: