Lookup de EJB local no Weblogic 10.3

37 respostas
D

Alguém que trabalha com EJB no Oracle Weblogic Server 10.3 sabe como fazer um lookup de EJB local por nome JNDI?

Investiguei todos os lugares e não encontrei referências para tal.

Há casos que não vou usar injeção de dependência (@EJB), por isso preciso de um simples lookup de EJB local.

Tenho seguinte EJB:

@Local({My.class}) @Remote({MyRemote.class}) @Stateless(name="My",mappedName="My") public class MyBean implements My, MyRemote { public void foo() { //do something } }

Para lookup do EJB remoto:

Para o EJB local eu não consegui com nenhum tipo de nome JNDI imaginável.

Dicas???

37 Respostas

D

Achei algo: http://m-button.blogspot.com/2008/07/reminder-on-how-to-use-ejb3-with.html

Vamos ver se resolve!

D

A solução é tosca demais. Dá vontade de regurgitar.
E dizem por ai que Weblogic é o melhor app server.

T

danieldestro:
A solução é tosca demais. Dá vontade de regurgitar.
E dizem por ai que Weblogic é o melhor app server.

Qual era a solução afinal? :?:

D

Esta: http://m-button.blogspot.com/2008/07/reminder-on-how-to-use-ejb3-with.html
Mas é tosca!

V

WebLogic é um lixo cara…
O compilador de ejbs deles não consegue trabalhar direito com generics, tipo vc nao pode sobreescrever um metodo numa subclasse que é um ejb e tenha generics, se nao da um pau de compilação kkkkkk
ou seja: pode esquecer Generic DAO

Na empresa que trabalho temos que usar WL porque é feito pela Oracle agora kkkkk

aquele link ai de cima foi o que usei pra achar os ejbs de dentro do WAR,
mas tem uma coisa que nunca consegui fazer ( e acho que nao vou): como fazer lookup local apartir de um InitialContext?
Tipo no jboss vc faz

new Initialcontext();
ctx.lookup(LOCAL_JNDI_NAME);

O problema é que no weblogic eu nao encontro em lugar nenhum o padrão da string de lookup LOCAL ( a de lookup remote é aquela que tem um #)
alguem sabe como faz isso?
valeu

D

Seguindo o link, você criou um Servlet para cada EJB que você precisa fazer lookup no WAR?

Sobre lookup de Ejb local. Eu abri chamado na Oracle e nem eles sabem como resolver isto.

V

entao PODEMOS FICAR TRANQUILOS né Daniel?

Se a DONA do java não sabe como fazer isso…

aheauiahieauhiauehaiue

quem somos nós pra saber?

é pákabá!

V

nao percebi que era uma pergunta sory :slight_smile:

nao criei um servlet pra cada EJB, mas toda vez q eu preciso de um EJB eu faço lookup assim:

// em algum backing bean do jsf
private ContratoDAO contratoService = (ContratoDAO) getEJB(ContratoDAO.JNDI_NAME);




//dentro do meu metodo de lookup
private static final String ROOT_LOCAL_ENV_JNDI = "java:comp/env/ejb/";

                try {
			return ctx.lookup(ROOT_LOCAL_ENV_JNDI + jndiName);
		} catch (NamingException e) {
			throw new RuntimeException(e);
		}

e o jndiName eu sempre coloco o valor que vc coloca no @stateless(name=JNDI_NAME) assim:

@Stateless(name = "ContratoDAO", mappedName = "ejb/ContratoDAO")
@Local( { ContratoDAO.class })
public class ContratoDAOImpl extends GenericDAOImpl<Contrato, Long> implements ContratoDAO {}

meu web.xml

<ejb-local-ref>
		<ejb-ref-name>ejb/ContratoDAO </ejb-ref-name>
		<ejb-ref-type>Session</ejb-ref-type>
		<local>pt.coface.billy.ejb.business. ContratoDAO </local>
	</ejb-local-ref>

valeu

D

Então você consegue fazer lookup de ejb local pelo JNDI, só precisa fazer o registro no web.xml, certo?

V

o que eu consigo:
de algum lugar dentro do war (servlet, jsf) lookup no ejb por jndi, mas cada ejb tem q ter aqela tag no web.xml (ejn-ref)

o que eu nao consigo:
dentro de um ejb (OU qualquer coisa que rode no fora do WAR) fazer lookup em outro ejb atraves de jndi ( neste caso o unico jeito eh usar @EJB nas referencias as interfaces locais;

algo assim:

class PaiEJBDAO{
@ejb
private OutroEJBLOCALINTErface outroejb;
}

valeu

D

A não ser que seja lookup pela interface remota, certo?

ejb = (MeuEjb) ctx.lookup(“MeuEjb#meu.pacote.MeuEjbRemote”);

V

eu nunca tentei, talvez ateh de

mas tipo isso seria que nem comer pao com fanta em restaurante de luxo, (em casa tem igualzinho e é bem mais barato)
eu me recuso a fazer um lookup remoto em ejbs do mesmo jar. credo!

D

Sim, claro.
Por isso insisto em Lookup de EJB local. Mas o Weblogic 10.3 não faz transparentemente. Imperdoável.

V

Destro vc ta sendo obrigado a usar weblogic né? eu acho que essa é a única explicação pra alguem usar isso.
cara tenta convencer quem tá te a te obrigar pra mudar pro jboss o quanto antes bicho
quando chegar a JCDI (WebBeans) vai ser um inferno pra rodar no weblogic ( se rodar!)
eu nao consigo fazer nenhum exemplo do seam rodar no weblogic, NENHUM!

I

Bom dia Daniel
Desculpe reabrir este tópico, mas estou com um problema semelhante a este que você teve.
Tenho uma pequena aplicação de teste que funciona perfeitamente no JBOss porém, quando publico no weblogic 11 não consigo fazer o look up. Lí o link que você postou, configurei os properties de initial context e url conforme o blog e também tomei cuidado no nome da minha interface remota.
Há alguma configuração para realizar no servidor para o look up poder funcionar? Quando vejo no servidor, tenho a informação que o ejb está ok porém, não consigo visualizar os nomes dos ejb’s.

Obrigado

D

Os nomes de lookup dos EJBs muda a cada application server. É ridículo ter uma especificação JEE e deixar os nomes a gosto de quem fez o app server. Enfim.

Em geral, no JBoss, o lookup é “nome-do-jar-ou-ear/nome-do-ejb”.

F

Icecold:
Bom dia Daniel
Desculpe reabrir este tópico, mas estou com um problema semelhante a este que você teve.
Tenho uma pequena aplicação de teste que funciona perfeitamente no JBOss porém, quando publico no weblogic 11 não consigo fazer o look up. Lí o link que você postou, configurei os properties de initial context e url conforme o blog e também tomei cuidado no nome da minha interface remota.
Há alguma configuração para realizar no servidor para o look up poder funcionar? Quando vejo no servidor, tenho a informação que o ejb está ok porém, não consigo visualizar os nomes dos ejb’s.

Obrigado


No WLS 10.3, escolhe o server onde foi feito o deploy e clica no JNDI Tree, conforme a imagem.

F

danieldestro:
Os nomes de lookup dos EJBs muda a cada application server. É ridículo ter uma especificação JEE e deixar os nomes a gosto de quem fez o app server. Enfim.

Em geral, no JBoss, o lookup é “nome-do-jar-ou-ear/nome-do-ejb”.


Daniel,

Vc já fez algum projeto em que um EJB (3.X) dentro do EAR x1 conversava com um EJB (3.X) dentro de um EAR x2 estando eles em servers diferentes?

D

Nunca, graças a Deus… rsrs…
No OC4J eu fiz assim, gerava os pacotes JAR dos meus EJBs, configurava no XML do oc4j (não usava o esquema de bibliotecas do Enterprise Manager dele não) e ai chamava os EJBs entre sim.

I

Pessoal bom dia.
Ainda sem sucesso no meu client para acessar o ejb publicado no weblogic server 11g

Segue o codigo para o meu context

public InitialContext getInitialContext( ) throws javax.naming.NamingException

{

Properties properties = new Properties( );

properties.put(Context.PROVIDER_URL, t3://localhost:8001);

properties.put(Context.INITIAL_CONTEXT_FACTORY, “weblogic.jndi.WLInitialContextFactory”);
return new InitialContext(properties); 
}

Segue código utilizado no lookup
hh = (HelloUserBeanRemote) initialContext.lookup(“HelloWorldEJB/interfaces.HelloUserBeanRemote”, interfaces.HelloUserBeanRemote.class);

Nome do EJB: hello
Interfaces remotas: interfaces.HelloUserBeanRemote
Nome do aplicativo: HelloWorldEJB

Outra questão: quais são os jars que devem ser adicionados ao client?

O erro que está ocorrendo é este:

javax.naming.NamingException: Couldnt connect to any host [Root exception is org.omg.CORBA.COMM_FAILURE:   vmcid: SUN  minor code: 203  completed: No]

at weblogic.corba.j2ee.naming.Utils.wrapNamingException(Utils.java:83)

at weblogic.corba.j2ee.naming.ORBHelper.getORBReferenceWithRetry(ORBHelper.java:605)

at weblogic.corba.j2ee.naming.ORBHelper.getORBReference(ORBHelper.java:559)

at weblogic.corba.j2ee.naming.InitialContextFactoryImpl.getInitialContext(InitialContextFactoryImpl.java:85)

at weblogic.corba.j2ee.naming.InitialContextFactoryImpl.getInitialContext(InitialContextFactoryImpl.java:31)

at weblogic.jndi.WLInitialContextFactory.getInitialContext(WLInitialContextFactory.java:46)

at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:667)

at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)

at javax.naming.InitialContext.init(InitialContext.java:223)

at javax.naming.InitialContext.(InitialContext.java:197)

at locator.ServiceLocator.getInitialContext(ServiceLocator.java:118)

at locator.ServiceLocator.(ServiceLocator.java:35)

at executar.MainWebLogic.main(MainWebLogic.java:20)

Caused by: org.omg.CORBA.COMM_FAILURE:   vmcid: SUN  minor code: 203  completed: No

at com.sun.corba.se.impl.logging.ORBUtilSystemException.writeErrorSend(ORBUtilSystemException.java:2259)

at com.sun.corba.se.impl.logging.ORBUtilSystemException.writeErrorSend(ORBUtilSystemException.java:2281)

at com.sun.corba.se.impl.transport.SocketOrChannelConnectionImpl.writeLock(SocketOrChannelConnectionImpl.java:957)

at com.sun.corba.se.impl.encoding.BufferManagerWriteStream.sendFragment(BufferManagerWriteStream.java:86)

at com.sun.corba.se.impl.encoding.BufferManagerWriteStream.sendMessage(BufferManagerWriteStream.java:104)

at com.sun.corba.se.impl.encoding.CDROutputObject.finishSendingMessage(CDROutputObject.java:144)

at com.sun.corba.se.impl.protocol.CorbaMessageMediatorImpl.finishSendingRequest(CorbaMessageMediatorImpl.java:247)

at com.sun.corba.se.impl.protocol.CorbaClientRequestDispatcherImpl.marshalingComplete1(CorbaClientRequestDispatcherImpl.java:355)

at com.sun.corba.se.impl.protocol.CorbaClientRequestDispatcherImpl.marshalingComplete(CorbaClientRequestDispatcherImpl.java:336)

at com.sun.corba.se.impl.protocol.CorbaClientDelegateImpl.invoke(CorbaClientDelegateImpl.java:129)

at com.sun.corba.se.impl.protocol.CorbaClientDelegateImpl.non_existent(CorbaClientDelegateImpl.java:232)

at org.omg.CORBA.portable.ObjectImpl._non_existent(ObjectImpl.java:137)

at weblogic.corba.j2ee.naming.ORBHelper.getORBReferenceWithRetry(ORBHelper.java:590)

 11 more

No weblogic, segue a tela do ejb implantado em anexo
Obrigado mais uma vez pela ajuda pessoal


F

como diria Jack: vamos por partes.

seu ejb.jar ou ejb.ear está implantado, não tem relação direta com o JNDI Name. Como dito anteriormente, vc deve atribuir o JNDI Name da interface do EJB mais ou menos assim:

static final String JNDI_NAME = "ExampleFacade#br.com.session.facade.interfaces.ExampleFacade";

depois, fazer isso:

@Stateless(mappedName="ExampleFacade")
public class ExampleFacadeImpl implements ExampleFacade {}

aí, para localizar vc faz a pesquisa pelo JNDI_NAME acima…
uma outra questão, é na hora de criar um stand-alone client…na hora do debug, vc deve retirar as Weblogic System Libraries e deixar apenas a wlclient.jar.

I

Bom dia Felipe
Fiz exatamente o que você falou e continuo com o mesmo erro. Agora estou apenas com o jar wlclient.jar.
Outra dúvida, após publicar o ejb no weblogic, eu não deveria visualizar os ejb statelles (no meu caso) que estão implantados?

Já nao sei mais o que fazer.

Para testar o que estou fazendo, peguei este ejb e publiquei tanto no glassfish quanto no jboss e funcionaram perfeitamente. Mas eu preciso implantar é no weblogic

A empresa adotou o weblogic como AS para as aplicações.

F

o erro é na hora de instanciar o Context, certo?

I

Sim

I

Sim

I

Exatamente Felipe

I

Exatamente

F

Pois é, nem chegou no EJB ainda…veja se o server está no ar e em qual porta ele atende pelo t3 (normalmente é a mesma do console), pois não conseguir carregar o Context, é algo errado nisso OU as bibliotecas que vc usa para o client.

I

Exatamente Felipe

I

Exatamente Felipe

I

Exatamente Felipe

E

Topico antigo mais acho que vale a pena deixar uma solução.
eu utilizo assim e funciona muito bem.

JNDI

<ejb-local-ref>
    	<ejb-ref-name>?JNDI que você quiser?</ejb-ref-name>
    	<ejb-ref-type>Session</ejb-ref-type>
    	<local>?caminho da session interface(local ou remota) ?</local>
    	<ejb-link>?nome do seu ModelEjb  ?.jar#?JNDI criada?</ejb-link>
 </ejb-local-ref>

look

public Object lookup(){
           try{

                Context ctx = new InitialContext();             
                Object servico = ctx.lookup("java:comp/env/"+getSource());
               return servico;
           }catch(Exception ex){
               ServiceException e = new ServiceException();
               String msg = "Ocorreu um erro ao localizar o serviço '" + getSource() + "'.";
               e.setMessage(msg);
               e.setRootCause(ex);
               e.setDetails(msg);
               e.setCode("Server.Processing");
               throw e;
           }
       }
E

Topico antigo mais acho que vale a pena deixar uma solução.
eu utilizo assim e funciona muito bem.

JNDI

<ejb-local-ref>  
        <ejb-ref-name>JNDI que você quiser</ejb-ref-name>  
        <ejb-ref-type>Session</ejb-ref-type>  
        <local>caminho da session interface(local ou remota) </local>  
        <ejb-link>nome do seu ModelEjb.jar#JNDI criada</ejb-link>  
</ejb-local-ref>

look

public Object lookup(){  
      try{  
  
           Context ctx = new InitialContext();               
           Object servico = ctx.lookup("java:comp/env/"+getSource());  
          return servico;  
      }catch(Exception ex){  
          ServiceException e = new ServiceException();  
          String msg = "Ocorreu um erro ao localizar o serviço '" + getSource() + "'.";  
          e.setMessage(msg);  
          e.setRootCause(ex);  
          e.setDetails(msg);  
          e.setCode("Server.Processing");  
          throw e;  
      }  
  }
E

Desculpa ressucitar esse topico mas tem como alguem me ajudar a criar um ServiceLocator para minha aplicaçao? Eu uso WebLogic também e tenho um ProjetoEJB e um PRojetoWEB ambos ja estao funcionando so preciso acessar as interfaces do EJB no projeto WEB.

Alguem Me ajuda por favor?

E

To fazendo dessa forma :

Me da o erro:

SEVERE: javax.naming.NameNotFoundException: While trying to look up comp/session/LogarService in /app/webapp/Teste/22744958.; remaining name 'comp/session/LogarService' javax.faces.el.EvaluationException: javax.naming.NameNotFoundException: While trying to look up comp/session/LogarService in /app/webapp/Teste/22744958.; remaining name 'comp/session/LogarService' at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:98) at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:98) at javax.faces.component.UICommand.broadcast(UICommand.java:311) at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:781) at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1246) at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:77) at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97) at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114) at javax.faces.webapp.FacesServlet.service(FacesServlet.java:308) at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:226) at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:124) at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:283) at weblogic.servlet.internal.TailFilter.doFilter(TailFilter.java:26) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42) at weblogic.servlet.internal.RequestEventsFilter.doFilter(RequestEventsFilter.java:26) at weblogic.servlet.internal.FilterChainImpl.doFilter(FilterChainImpl.java:42) at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3402) at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321) at weblogic.security.service.SecurityManager.runAs(Unknown Source) at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2140) at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2046) at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1398) at weblogic.work.ExecuteThread.execute(ExecuteThread.java:200) at weblogic.work.ExecuteThread.run(ExecuteThread.java:172)

E

agora da o seguinte erro

Mapiei assim no web.xml do meu ProjetoWEB

<ejb-local-ref> <ejb-ref-name>ejb/LogarServiceBean</ejb-ref-name> <ejb-ref-type>Session</ejb-ref-type> <local>TesteEJB.session.LogarServiceBean</local> </ejb-local-ref>

Porem esse pacote session esta no ProjetEJB como faço?

E

esse link vai te ajudar.

http://architecture-journal.blogspot.com/2007/08/servicelocator-no-ejb-30.html

Criado 15 de julho de 2009
Ultima resposta 8 de fev. de 2012
Respostas 37
Participantes 7