Spring + JNDI + tomcat

Boa tarde à todos.

Estou interessado em deixar minha configuração com o banco de dados à cargo do meu servidor de aplicação(Tomcat 5.5.20). Para isto estou utilizando JNDI e arquivos xml.

no tomcat…
tomcat-5.5.20\conf\context.xml

<Context>
....
   <Resource 
      name="jdbc/myDataSource" 
      auth="Container" 
      type="javax.sql.DataSource"
      driverClassname="org.postgresql.Driver"
      url="jdbc:postgresql://201.7.193.141/pdsBackup"
      username="postgres"
      password="postgres"
      maxActive="10"
      maxIdle="10"
      removeAbandoned="true"
      factory="org.apache.naming.factory.BeanFactory"
   />
...
</Context>

contexto da minha aplicação

persistenceContext.xml

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" abstract="false" singleton="true" lazy-init="default" autowire="default" dependency-check="default">
		
		<!-- Faz esta tag apontar para o data source definido -->
		<property name="dataSource">
			<ref local="dataSource" />
		</property>
				
		<property name="mappingResources">
			<list>
				<value>hibernate/*.hbm.xml</value>
				<value>hibernate/*.hbm.xml</value>
				<value>hibernate/*.hbm.xml</value>
				....
			</list>
		</property>
		 
		<property name="hibernateProperties">
			<props>				
				<prop key="hibernate.dialect"> ... </prop>
				<prop key="show_sql">true</prop>
				<prop key="use_outer_join">true</prop>
				<prop key="hibernate.cglib.use_reflection_optimizer">true</prop>
			</props>
		</property>
		
	</bean>

<!-- Meu DataSource esta referenciando minha definição do Context.xml via JNDI-->
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
		<property name="jndiName">
			<value>java:comp/env/jdbc/myDataSource</value>
		</property>
				
	</bean>

<!-- Minhas beans por ioc estão referenciando minha tag sessionFactory -->

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" abstract="false" singleton="true" lazy-init="default" autowire="default" dependency-check="default">
		<property name="sessionFactory">
			<ref bean="sessionFactory" />
		</property>
	</bean>

A exceção que esta vindo para mim referencia o DataSource:

Alguém poderia me ajudar com esse problema??
Já coloquei a configuração no Server.xml direto no contexto da aplicação e agora está no Context.xml… meu jar do postgres parece estar no local correto dentro do tomcat (common/lib).

Abraços à todos.

Cara, dê uma olhada neste POST. Eles discutiram uma coisa semelhante a sua.
Tem também uns links interessantes para você dá uma olhada.

Bom dia jmoreira,

Cara, ja tinha olhado este post que você está me mandando. O problema do cara era que ele não havia startado o contexto (tomcat). O que ele apresenta não tem nada a ver com o que eu estou mostrando: e ele está pegando a conexão diretamente no código… enquanto eu estou tentando iniciar a conexão via um contexto de Spring.
O único link que ele disponibilizou está quebrado… http://tomcat.apache.org/tomcat-5.0-doc/jndi-datasource-examples-howto.html … o link que eles estão se referenciando mudou para: http://tomcat.apache.org/tomcat-5.5-doc/jndi-resources-howto.html . Estou olhando o que tem nesse link, mas não vi nada de mirabolante que não tenha feito antes… :slight_smile: .

De qualquer forma, agradeço sua ajuda… se tiver mais alguma dica.

Abraço.
Rafael

Talvez isso que vou colocar seja importante… antes de eu adicionar a linha no contexto que coloquei no tomcat:

... factory="org.apache.naming.factory.BeanFactory" ...
estava dando o seguinte erro:

[quote] …
Cannot create JDBC driver of class ‘’ for connect URL ‘jdbc:postgresql://201.x.xxx.1x1/blablabla’
Context initialization failed

java.lang.IllegalArgumentException: Cannot convert value of type [org.apache.tomcat.dbcp.dbcp.BasicDataSource] to required type [org.apache.commons.dbcp.BasicDataSource] for property ‘dataSource’: no matching editors or conversion strategy found
…[/quote]

Alguém sabe me dizer se eu tomei o procedimento correto??

Obrigado! :wink:

Você já baixou o JDBC Driver http://jdbc.postgresql.org/ e inclui no classpath?

Por favor… quem estiver lendo este tópico leia esta mensagem.

Cometi erros bárbaros acima… abstraiam o que eu fiz na factory do contexto do tomcat factory="org.apache.naming.factory.BeanFactory" O contexto correto fica da seguinte forma:

<Context ... <Resource name="jdbc/myDataSource" auth="Container" type="javax.sql.DataSource" driverClassname="org.postgresql.Driver" url="jdbc:postgresql://201.x.x9x.1x1/xxxBackup" username="postgres" password="postgres" maxActive="10" maxIdle="10" removeAbandoned="true" /> ... </Context> Corrigi uma parte do meu codigo (adaptei) para que ele possa suportar o objeto BasicDataSource que vem do tomcat (org.apache.tomcat.dbcp.dbcp.BasicDataSource).

O problema que me está aparecendo agora é o seguinte (não está aparecendo como uma exceção):

Já coloquei o jar do postgres no tomcat tanto em common/lib quanto no server/lib… mas o erro continua.

Alguma boa alma pode me ajudar…

No meu projeto está assim:

applicationContext-resources.xml

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
&lt;beans 	xmlns="http://www.springframework.org/schema/beans"
       	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       	xmlns:jee="http://www.springframework.org/schema/jee"
		xsi:schemaLocation="
       	http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
       	http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd"&gt;
	
	&lt;jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/teste"/&gt; 
&lt;/beans&gt;

context.xml (Creio que seja obrigatório ser escrito em minúsculo)

&lt;Context&gt;
  &lt;Resource name="jdbc/teste" auth="Container" type="javax.sql.DataSource"
            maxActive="100" maxIdle="30" maxWait="10000" 
			username="teste" password="teste" driverClassName="org.postgresql.Driver"
            url="jdbc:postgresql://server:5432/teste"/&gt;
&lt;/Context&gt;

Grande ANDRÉ!!!

Cara… seguinte, não sei sobre o que você estava falando daquele esquema de minusculas, mas se for sobre o nome da conexão no contexto [name=“jdbc/myDataSource”] tentei alterar isso como tu me falou e não adiantou. Então… como quem não quer nada dei mais uma olhada no meu contexto para ver mais coisas que poderiam estar erradas como maiusculas e minusculas… e percebi que a propriedade driverClassName estava escrita errada, estava “driverClassName”… :oops:

Muito obrigado por me mostrar a luz cara! hehehe :wink:
Abraço!!!