Saber todos os nomes JNDI disponíveis no Contexto atual

7 respostas
C

Galera,

Gostaria de saber se existe uma maneira de pegar todos os nomes disponíveis no JNDI no Contexto atual.
Imagino algo como:

getServletContext().getJndiNames();

E o retorno como:

java:comp/env/BeanManager
java:comp/env/jdbc
etc…

Obrigado!!

7 Respostas

T

Tenta…

ctx.list("");
M

Por coincidência estou estudando EJB 3.1 neste exato momento, me perguntando pq o cara da apostila consegue acessar o objeto remoto dele e eu não…

Daí pesquisei e achei um codigozinho fácil:

C

É exatamente o que procurava.
Galera fiz o seguinte:

new InitialContext().list("java:comp/env/") 
// me retornou o BeanManager (do CDI Weld).

E então:

new InitialContext().lookup("java:comp/env/BeanManager");

No JBoss funcionou perfeitamente.
No Tomcat 7 me retornou o erro abaixo. Como o código de listagem me retornou o BeanManager, não teria que funcionar??

javax.naming.NamingException: Cannot create resource instance
    at org.apache.naming.factory.ResourceEnvFactory.getObjectInstance(ResourceEnvFactory.java:117)
	at javax.naming.spi.NamingManager.getObjectInstance(Unknown Source)
	at org.apache.naming.NamingContext.lookup(NamingContext.java:843)
	at org.apache.naming.NamingContext.lookup(NamingContext.java:154)
	at org.apache.naming.NamingContext.lookup(NamingContext.java:831)
	at org.apache.naming.NamingContext.lookup(NamingContext.java:154)
	at org.apache.naming.NamingContext.lookup(NamingContext.java:831)
	at org.apache.naming.NamingContext.lookup(NamingContext.java:168)
	at org.apache.naming.SelectorContext.lookup(SelectorContext.java:158)
	at javax.naming.InitialContext.lookup(Unknown Source)
	at com.teste.controller.TesteCDI3.doGet(TesteCDI3.java:31)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at com.teste.ServletObjectsRequestFilter.doFilter(ServletObjectsRequestFilter.java:39)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
A

CodeDeveloper:
É exatamente o que procurava.
Galera fiz o seguinte:

new InitialContext().list("java:comp/env/") 
// me retornou o BeanManager (do CDI Weld).

E então:

new InitialContext().lookup("java:comp/env/BeanManager");

No JBoss funcionou perfeitamente.
No Tomcat 7 me retornou o erro abaixo. Como o código de listagem me retornou o BeanManager, não teria que funcionar??

Não, o Tomcat 7 não suporta CDI nativamente como o JBoss. Por isso deu o erro.

C

Ataxexe:

Não, o Tomcat 7 não suporta CDI nativamente como o JBoss. Por isso deu o erro.

Mesmo que ele esteja configurado corretamente para implementar o CDI (context.xml, web.xml, jars do weld e etc) não é possível pegar o BeanManager via lookup?
Se não, você teria uma explicação simples para que eu possa entender o porque?

Iria ajudar muito!!
Obrigado.

A

CodeDeveloper:
Ataxexe:

Não, o Tomcat 7 não suporta CDI nativamente como o JBoss. Por isso deu o erro.

Mesmo que ele esteja configurado corretamente para implementar o CDI (context.xml, web.xml, jars do weld e etc) não é possível pegar o BeanManager via lookup?
Se não, você teria uma explicação simples para que eu possa entender o porque?

Iria ajudar muito!!
Obrigado.

O JNDI do Tomcat é read-only, então, você precisa configurar algumas coisas pra conseguir fazer o lookup do BeanManager.

Dê uma olhada na documentação:

http://docs.jboss.org/weld/reference/1.0.0/en-US/html/environments.html#d0e4998

C

Ataxexe,

Agora consegui. O problema é que o context.xml estava na raiz da aplicação, e não no WEB-INF/classes como deveria.

Agradeço a ajuda de todos!

Criado 18 de dezembro de 2012
Ultima resposta 2 de jan. de 2013
Respostas 7
Participantes 4