Migrando aplicação de jboss para TomCat (Inclusive com EJB)

Por acaso alguém ai sabe porque quando acesso um Session Bean a partir do jboss com o seguinte código :


Hashtable environment = new Hashtable();

environment.put(Context.INITIAL_CONTEXT_FACTORY, “org.jnp.interfaces.NamingContextFactory”);
environment.put(Context.URL_PKG_PREFIXES, “org.jboss.naming:org.jnp.interfaces”);
environment.put(Context.PROVIDER_URL, “jnp://localhost:1099”);
Context context = new InitialContext(environment);
org.jnp.interfaces.NamingContext ref = (org.jnp.interfaces.NamingContext)context.lookup("/");
context.list("/");
org.jnp.interfaces.MarshalledValuePair obj = (org.jnp.interfaces.MarshalledValuePair)context.lookupLink("/CadMu");
Object teste = obj.get();
ClasseExemploHome testeCadmu = (ClasseExemploHome)PortableRemoteObject.narrow(teste, br.gov.bcb.comum.cadmu.negocio.fachada.ClasseExemploHome.class);


Funciona normalmente, porém quando tento acessar esse SessionBean a partir do TomCat com o mesmo código e utilizando as bibliotecas do JBoss, Ocorre um “java.lang.NoSuchMethodException: javax.ejb.EJBObject.getPrimaryKey()” , o que significa que o lookup está tentando pegar um Ejb do tipo EntityBean e não um SessionBean.

O que eu pergunto é : Porque o TomCat encara esse Session Bean como um Entity bean ?

Existe alguma forma de informar o TomCat antes de realizar o lookup() que o objeto que ele irá buscar é um Session Bean ?

tom cat não suporte EJB

Eu sei que o tomcat não é um servidor de aplicao. Eu não to tentando fazer deploy do ejb no tom cat. Eu to tentando acessar remotamente um objeto Sessionbean localizado na máquina virtual iniciada pelo JBoss() por meio daquela implementação.

Já conseguir localizar o jndi do jboss que representa esse objeto remoto, mas o problema é que ele por definição(talvez) encara um ejb como do tipo EntityBean, e é um SessionBean. Daí na hora do lookup ele chama o método getPrimaryKey() do Entity Bean , e como o Session bean não apresenta esse método dá

“java.lang.NoSuchMethodException: javax.ejb.EJBObject.getPrimaryKey()”

… Queria saber como faço para informar no contexto que se trata de um Session Bean e não um Entity Bean ???

Hum, você quer acessar da camada Web um Entity Bean ou um SessionBean? Verifique o JNDI que vc esta passando para o lookup…
Funciona se estiver rodando no JBoss?

Bom, posta o código de lookup…

Cara, eu tive sérios problemas ao tentar acessar os EJBS quando utilizei dois servidores.

Módulo WEB no Tomcat standalone
Módulo EJB no JBoss standalone

E não consegui NEM A PAU.
Estou esperando terminar o semestre pra correr atrás dessas informações… mas eu acho que aqui… você não vai encontrar ajuda. Ao passo que na época que eu precisei, não apareceu ninguém.

(todo rancoroso :P)

Galera, eu resolvi assim :

Hashtable environment = new Hashtable();
environment.put(Context.INITIAL_CONTEXT_FACTORY, “org.jnp.interfaces.NamingContextFactory”);
environment.put(Context.URL_PKG_PREFIXES, “org.jboss.naming:org.jnp.interfaces”);
environment.put(Context.PROVIDER_URL, “jnp://10.10.30.36:1099”);
Context ctx = new InitialContext(environment);

            Object o = ctx.lookup(jndi);
            InstanciaSessionHome home = (InstanciaSessionHome )PortableRemoteObject.narrow(o, br.gov.etc.fachada.InstanciaSessionHome.class);
            instancia = home.create();

Com esse codigo vc pode acessar qualquer jdni presente no JBoss. Se no souber o nome do jndi voc pode usar o metodo :

NamingContext teste = (NamingContext) ctx.lookup(’’/’’):
teste.list(’’/’’); (Voce executa esse codigo com inspect!)