title: Spring dataSource bean definition failing
body: <p>I'm trying to use Spring's JdbcTemplate to simplify my DAOs in a Java web service that is deployed in Tomcat and connects to Postgres.</p>
  
  <p>I'm following <a href="http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/jdbc.html" rel="nofollow">Spring's documention</a>, and I'm trying configure a DataSource in the application context file, as follows:</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
  &lt;beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:context="http://www.springframework.org/schema/context"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
          http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context-3.0.xsd"&gt;
  
    &lt;context:component-scan base-package="com.manta" /&gt;
  
    &lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&gt;
      &lt;property name="driverClassName" value="${driverClassName}"/&gt;
      &lt;property name="url" value="${url}"/&gt;
      &lt;property name="username" value="${username}"/&gt;
      &lt;property name="password" value="${password}"/&gt;
    &lt;/bean&gt;
  
    &lt;context:property-placeholder location="/WEB-INF/db.properties"/&gt;
  
  &lt;/beans&gt;
  </code></pre>
  
  <p>I have the following <code>db.properties</code> file in the appropriate place:</p>
  
  <pre><code>driverClassName=org.postgresql.Driver 
  url=jdbc:postgresql://pgprod.ecnext.com:5432/manta
  username=my_user_name
  password=my_password
  </code></pre>
  
  <p>When I try to deploy, I find the following stack trace in <code>catalina.out</code>:</p>
  
  <pre><code>SEVERE: Context initialization failed
  org.springframework.beans.factory.BeanDefinitionStoreException: 
  Invalid bean definition with name 'dataSource' defined in ServletContext resource [/WEB-INF/context.xml]: 
  Could not resolve placeholder 'driverClassName'
      at org.springframework.beans.factory.config.PlaceholderConfigurerSupport.doProcessProperties(PlaceholderConfigurerSupport.java:209)
      at org.springframework.beans.factory.config.PropertyPlaceholderConfigurer.processProperties(PropertyPlaceholderConfigurer.java:220)
      at org.springframework.beans.factory.config.PropertyResourceConfigurer.postProcessBeanFactory(PropertyResourceConfigurer.java:84)
      at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:681)
      at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:656)
      at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:446)
      at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:385)
      at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:284)
      at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111)
      at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4765)
      at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5260)
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
      at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:866)
      at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:842)
      at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:615)
      at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:958)
      at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1599)
      at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
      at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
      at java.util.concurrent.FutureTask.run(FutureTask.java:166)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
      at java.lang.Thread.run(Thread.java:679)
  </code></pre>
  
  <p>Things that are NOT the problem:</p>
  
  <ol>
  <li>The <code>db.properties</code> file is in the correct location.</li>
  <li>The credentials in the <code>db.properties</code> are correct, and can be read in manually to connect to the database.</li>
  <li>The <code>context.xml</code> file is being found by the ContextLoaderListener, and I am able to inject other dependencies.</li>
  </ol>
  
  <p>I would very much appreciate any suggestions as to what could cause this. I'm using Spring 3.1.1, and Tomcat 7.0.26.</p>