Acessando Beans pelo contexto inicial

Uma pequena dúvida, se através de um session bean eu quiser achar, por exemplo, um entity bean na JNDI da seguinte forma:

BeanLocalHome beanHome;
InitialContext ic = null;
ic = new InitialContext();
beanHome = (BeanLocalHome) ic.lookup("java:comp/env/BeanLocal");

…como devo fazer? Tenho idéia de que devo definir um jndi name, no caso BeanLocal, referenciando o nome do entity bean, mas não sei aonde faço isso.

P.S.: Estou usando o JBOSS.

vc faz isso no descritor de implantação do bean! :grin:

<ejb-name>MeuBean</ejb-name>

Não, assim não funcionou… ele solta uma javax.naming.NameNotFoundException: MeuBean not bound

No caso eu to fazendo a seguinte experiencia:

Tenho um bean chamado operacoes e beans auxiliares, um bean soma, outro subtracao, outro divisao, outro multiplicacao. O Cliente so chama o bean operacoes e este delega a operacao chamada ao bean compativel. So que nao consigo chamar os outros beans no bean operacao daquela forma q citei acima.

então vc diz q do cliente consegue fazer lookup e encontrar a referencia do EJB, mas de um EJB para outro não!?? :roll:

É… mas consegui resolver dessa forma:

public double soma(double a, double b)
{
        double result;
        try
        {
            jndiContext = new InitialContext();
            Object ref = jndiContext.lookup("Soma");
    		SomaHome home = (SomaHome) PortableRemoteObject.narrow (ref, SomaHome.class);
    		Soma soma = home.create();
    		result = soma.soma(a, b);
        }
        catch(NamingException e)
        {
            e.printStackTrace();
        }
        catch(CreateException e)
        {
            e.printStackTrace();
        }
        catch(RemoteException e)
        {
            e.printStackTrace();
        }

        return result;
}

Nao seria melhor usar SomaLocalHome!?! Assim, vc nao faz uma chamada remota, pois ambos os beans estarao no servidor de aplicacao.

Bom, qndo eu quero localizar um EJB dentro de outro,nao sei se eh pq eu utilizo lomboz, mas ele cria uma classe (ou interface, agora nao me lembro) Util. No seu caso ficaria SomaUtil. E nessa classe (ou interface) tem o metodo getHome e getLocalHome, no meu caso eu uso o getLocalHome e ele fornece retorna uam interface Local (SomaLocal, no seu caso) para poder usar os métodos do bean.

Na verdade aprigioneto, o ejb-name que vc atribui ao seu bean deve estar no arquivo ejb-jar.xml, com esse nome definido vc especicfica um jndi-name ou local-jndi-name para ele no jboss.xml, então é esse nome que vc usa para fazer lookup

no ejb-jar
<entity >
<ejb-name>MeuBean</ejb-name>
<local-home>Bean</local-home>
<local>BeanLocal</local>
</entity >

no jboss.xml
<entity>
<ejb-name>MeuBean</ejb-name>
<jndi-name>BeanJndi</ljndi-name>
</entity>

Daí vc usa o nome “BeanJndi” para fazer lookup

Blz? Até mais