[Resolvido] Tomcat 5.5 + Name jdbc is not bound in this Context + Spring

Pessoal, boa tarde. Tenho um Resource configurado para um contexto, realizando um pool de conexões com um banco Oracle 11g. Estou utilizando o seguinte código para obter a conexão:

Object o = new InitialContext().lookup("java:comp/env/jdbc/orcl");
		out.println("--- Conexao com DataSource \n");
		if( o instanceof DataSource ) {
			out.println("Encontrado datasource. Recebendo conexão. \n");
			DataSource ds = (DataSource) o;
			Connection conexao = ds.getConnection();
			out.println("Dados:" + conexao.getMetaData().getDatabaseMajorVersion());
			conexao.close();
			
			
		} else {
			out.println("DataSource não foi encontrado\n");
			if( o == null ) {
				out.println("Busca do contexto retornou null \n");
			}
		}

Se eu utilizar uma JSP, o código roda com sucesso.

Se eu utilizar o mesmo código dentro de um controller do Spring, eu consigo verificar o seguinte erro no log do Tomcat

Name jdbc is not bound in this Context
org.apache.naming.NamingContext	NamingContext.java		153	lookup
org.apache.naming.factory.ResourceLinkFactory	ResourceLinkFactory.java		97	getObjectInstance
javax.naming.spi.NamingManager	NamingManager.java		304	getObjectInstance
org.apache.naming.NamingContext	NamingContext.java		793	lookup
org.apache.naming.NamingContext	NamingContext.java		140	lookup
org.apache.naming.NamingContext	NamingContext.java		781	lookup
org.apache.naming.NamingContext	NamingContext.java		153	lookup
br.com.insoft.pool.ConnectionUtil	ConnectionUtil.java		33	getConnection

Por que o resource fica disponível por uma JSP e por um Servlet não?

Deve ter outra coisa errada influenciando ai…pq o codigo do JNDI funciona transparentemente, desde que o o busca seje feito de um objeto sendo executado dentro do container…
Dentro do spring ou dentro de um servlet? To confuso :?

Mais alguns dados…

Config dentro do server.xml:

<Context path="/MinhaApp" docBase="...caminhobase..." debug="0" reloadable="true" privileged="true" >
            <Resource name="jdbc/orcl"
               auth="Container"
               type="oracle.jdbc.pool.OracleDataSource"
               driverClassName="oracle.jdbc.driver.OracleDriver"
               factory="oracle.jdbc.pool.OracleDataSourceFactory"
               url="jdbc:oracle:thin:@ip:porta:banco"
	       user="..."
	       password="..."
               implicitCachingEnabled="true"
               connectionCachingEnabled="true"
               connectionCacheProperties="{InitialLimit=10, MinLimit=10, MaxLimit=50, MaxStatementsLimit=0, ConnectionWaitTimeout=20}"
               connectionCacheName="cacheOrcl"
            />
        </Context>

Config dentro do web.xml do contexto:

	<resource-ref>
	   <description>Pool de conexões JDBC</description>
	   <res-ref-name>jdbc/orcl</res-ref-name>
	   <res-type>oracle.jdbc.pool.OracleDataSource</res-type>
	   <res-auth>Container</res-auth>
	</resource-ref>

Config no context.xml (global)

<ResourceLink global="jdbc/orcl" name="jdbc/orcl" type="oracle.jdbc.pool.OracleDataSource"/>

[quote=FernandoFranzini]Deve ter outra coisa errada influenciando ai…pq o codigo do JNDI funciona transparentemente, desde que o o busca seje feito de um objeto sendo executado dentro do container…
Dentro do spring ou dentro de um servlet? To confuso :? [/quote]

Pois é, eu também fiquei confuso…

Foi instalado o Probe naquele servidor, e o teste de conexão dele também funciona. Andei olhando o código e ele também está usando o Spring, a única diferença é que ele configurou por xml e eu usei annotations.

Olhando mais um pouco no log do tomcat, achei outro erro (logo ao subir o servidor):

06/09/2011 08:38:30 oracle.jdbc.driver.OracleDriver registerMBeans
SEVERE: Error while registering Oracle JDBC Diagnosability MBean.
javax.management.MalformedObjectNameException: Invalid character '
' in value part of property
	at javax.management.ObjectName.construct(ObjectName.java:529)
	at javax.management.ObjectName.&lt;init&gt;(ObjectName.java:1314)
	at oracle.jdbc.driver.OracleDriver.registerMBeans(OracleDriver.java:303)
	at oracle.jdbc.driver.OracleDriver$1.run(OracleDriver.java:213)
	at java.security.AccessController.doPrivileged(Native Method)
	at oracle.jdbc.driver.OracleDriver.&lt;clinit&gt;(OracleDriver.java:209)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:242)
	at java.sql.DriverManager.getCallerClass(DriverManager.java:442)
	at java.sql.DriverManager.getDrivers(DriverManager.java:336)
	at org.apache.catalina.loader.WebappClassLoader.clearReferences(WebappClassLoader.java:1578)
	at org.apache.catalina.loader.WebappClassLoader.stop(WebappClassLoader.java:1496)
	at org.apache.catalina.loader.WebappLoader.stop(WebappLoader.java:734)
	at org.apache.catalina.core.StandardContext.stop(StandardContext.java:4398)
	at org.apache.catalina.core.ContainerBase.removeChild(ContainerBase.java:893)
	at org.apache.catalina.startup.HostConfig.undeployApps(HostConfig.java:1180)
	at org.apache.catalina.startup.HostConfig.stop(HostConfig.java:1151)
	at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:313)
	at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:120)
	at org.apache.catalina.core.ContainerBase.stop(ContainerBase.java:1055)
	at org.apache.catalina.core.ContainerBase.stop(ContainerBase.java:1067)
	at org.apache.catalina.core.StandardEngine.stop(StandardEngine.java:448)
	at org.apache.catalina.core.StandardService.stop(StandardService.java:510)
	at org.apache.catalina.core.StandardServer.stop(StandardServer.java:734)
	at org.apache.catalina.startup.Catalina.stop(Catalina.java:602)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:577)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:585)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:295)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:433)

Bom, mandei novamente o war e funcionou no controller.

Mesmo assim, ficaram algumas dicas interessantes sobre o tópico, que podem ser vistas aqui:

http://stackoverflow.com/questions/7325881/jndi-resource-not-found-in-spring-controller-but-works-in-jsp