4

Spring の JdbcTemplate を使用して、Tomcat にデプロイされて Postgres に接続する Java Web サービスで DAO を簡素化しようとしています。

私はSpringのドキュメントに従っており、次のようにアプリケーションコンテキストファイルでDataSourceを構成しようとしています:

<?xml version="1.0" encoding="UTF-8"?>
<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">

  <context:component-scan base-package="com.manta" />

  <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${driverClassName}"/>
    <property name="url" value="${url}"/>
    <property name="username" value="${username}"/>
    <property name="password" value="${password}"/>
  </bean>

  <context:property-placeholder location="/WEB-INF/db.properties"/>

</beans>

適切な場所に次のdb.propertiesファイルがあります。

driverClassName=org.postgresql.Driver 
url=jdbc:postgresql://pgprod.ecnext.com:5432/manta
username=my_user_name
password=my_password

デプロイしようとすると、次のスタック トレースが に見つかりますcatalina.out

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)

問題ではないこと:

  1. ファイルはdb.properties正しい場所にあります。
  2. の認証情報db.propertiesは正しく、データベースに接続するために手動で読み込むことができます。
  3. context.xmlファイルは ContextLoaderListener によって検出され、他の依存関係を注入できます。

何が原因であるかについての提案をいただければ幸いです。Spring 3.1.1 と Tomcat 7.0.26 を使用しています。

4

5 に答える 5

6

おそらく<context:property-placeholder ... >プロジェクトには複数あり、それぞれが基礎となるオブジェクトの新しいインスタンスを作成し、苦痛への入り口です...

私は、プロパティ ファイルをロードするために次の宣言を使用することを好みます。

<bean id="propertyConfigurer"     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath:db-config.properties</value>
        </list>
    </property>
    <property name="ignoreUnresolvablePlaceholders" value="true" />
</bean>
于 2012-05-04T14:05:58.853 に答える
4

あなたの場所から先頭のスラッシュを削除するか (つまりlocation="WEB-INF/db.properties")、それをクラスパスに変更することをお勧めします。

location="classpath:db.properties"
于 2012-05-04T14:03:59.750 に答える
1

use org.springframework.jdbc.datasource.DriverManagerDataSource それ以外のorg.apache.commons.dbcp.BasicDataSource

于 2012-05-04T14:02:20.370 に答える
0

アプリケーションコンテキストでignore-unresolvable="true"を使用してください。デフォルト値は「fales」です。「true」に設定する必要があるため、まだアクセスしていないコンテキスト内の他のユーザーにキーを渡します。

<context:property-placeholder ignore-unresolvable="true" location="/WEB-INF/application.properties" />
<context:property-placeholder ignore-unresolvable="true" location="/WEB-INF/dbcp.properties"/>
于 2014-03-16T13:32:39.547 に答える
0

Maven の依存関係が適切にあることを確認してください。Sping-core および Spring-context の依存関係がプロジェクトに存在する必要があります。

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version></version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version></version>
        </dependency>
于 2015-04-20T09:43:11.853 に答える