Lookup de EJB local no Weblogic 10.3

37 respostas
danieldestro

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

danieldestro

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

Vamos ver se resolve!

danieldestro

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

Tchello

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? :?:

danieldestro

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

vitenho

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

danieldestro

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.

vitenho

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á!

vitenho

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

danieldestro

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

vitenho

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

danieldestro

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

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

vitenho

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!

danieldestro

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

vitenho

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!

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

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”.

felipeguerra

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.

felipeguerra

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?

danieldestro

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.

Icecold

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


felipeguerra

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.

Icecold

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.

felipeguerra

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

Icecold

Sim

Icecold

Sim

Icecold

Exatamente Felipe

Icecold

Exatamente

felipeguerra

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.

Icecold

Exatamente Felipe

Icecold

Exatamente Felipe

Icecold

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;  
      }  
  }
evertonsilvagomesjav

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?

evertonsilvagomesjav

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)

evertonsilvagomesjav

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