2013-09-26 32 views
0

在Spring中發現以下錯誤。使用屬性文件在Spring中連接數據庫的錯誤

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: 
### Error updating database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: ${jdbc.driverClassName} 
### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: ${jdbc.driverClassName} 
    at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73) 
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:364) 
    at sun.proxy.$Proxy9.insert(Unknown Source) 
    at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:236) 
    at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:46) 
    at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:43) 
    at sun.proxy.$Proxy10.insertUserInfo(Unknown Source) 
    at com.da.thinkserver.centro.dao.impl.UserInfoDaoImpl.inserUserInfo(UserInfoDaoImpl.java:17) 
    at com.da.thinkserver.centro.UserInfoTest.userInfoTest(UserInfoTest.java:22) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74) 
    at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83) 
    at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189) 
    at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165) 
    at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85) 
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115) 
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75) 
Caused by: org.apache.ibatis.exceptions.PersistenceException: 
### Error updating database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: ${jdbc.driverClassName} 
### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: ${jdbc.driverClassName} 
    at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:23) 
    at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:150) 
    at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:137) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:601) 
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:354) 
    ... 41 more 
Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: ${jdbc.driverClassName} 
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:80) 
    at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:80) 
    at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:66) 
    at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:271) 
    at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:69) 
    at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:44) 
    at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:100) 
    at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:75) 
    at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:148) 
    ... 47 more 
Caused by: java.sql.SQLException: ${jdbc.driverClassName} 
    at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:254) 
    at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:182) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:699) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:631) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:485) 
    at org.apache.tomcat.jdbc.pool.ConnectionPool.<init>(ConnectionPool.java:143) 
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:116) 
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:103) 
    at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:127) 
    at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111) 
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77) 
    ... 55 more 
Caused by: java.lang.ClassNotFoundException: ${jdbc.driverClassName} 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:423) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:356) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:266) 
    at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:246) 
    ... 65 more 

以下bean xml我用來連接數據庫。

<?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:tx="http://www.springframework.org/schema/tx" 
    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.2.xsd 
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-3.2.xsd 
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.2.xsd"> 

    <context:property-placeholder location="classpath:database.properties"/> 
    <context:annotation-config /> 

    <tx:annotation-driven transaction-manager="transactionManager" /> 

    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
     <property name="dataSource" ref="dataSource" /> 
    </bean> 

    <!-- 
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
     <property name="driverClass" value="com.mysql.jdbc.Driver" /> 
     <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/thinkserver" /> 
     <property name="user" value="root" /> 
     <property name="password" value="" /> 
    </bean> 
    --> 
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> 
     <property name="driverClass" value="${jdbc.driverClassName}" /> 
     <property name="jdbcUrl" value="${jdbc.url}" /> 
     <property name="user" value="${jdbc.username}" /> 
     <property name="password" value="${jdbc.password}" /> 
    </bean> 

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="mapperLocations" value="classpath:mapper/*.xml" /> 
    </bean> 

    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 
     <property name="basePackage" value="com.da.thinkserver.centro.dao.mapper" /> 
     <property name="sqlSessionFactory" ref="sqlSessionFactory" /> 
    </bean> 

</beans> 

database.properties

jdbc.driverClassName=com.mysql.jdbc.Driver 
jdbc.url=jdbc:mysql://localhost:3306/thinkserver 
jdbc.username=root 
jdbc.password= 

檢查屏幕截圖目錄結構。

enter image description here

+0

是類路徑根目錄的屬性? –

+0

是,/resources/database.properties。 –

+0

您的示例適用於我,如果'/ resources'中的所有內容都位於類路徑的根目錄下? –

回答

0

替換此代碼

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 
     <property name="basePackage" value="com.da.thinkserver.centro.dao.mapper" /> 
     <property name="sqlSessionFactory" ref="sqlSessionFactory" /> 
</bean> 

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 
     <property name="basePackage" value="com.da.thinkserver.centro.dao.mapper" /> 
</bean> 

無需設置的SqlSessionFactory。

+0

就其本身而言,這不會固定任何東西。 –

-2

關閉我的頭頂:你要告訴Spring約database.properties文件,對不對?你好嗎?像這樣?

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="classpath:database.properties"/>

+1

'context:property-placeholder'就是這樣。 –

0

它似乎並不像你聲明src/main/resources作爲Eclipse的一個source folder。因此,啓動應用程序時,它不會在類路徑中使用它。

用鼠標右鍵單擊/resources文件夾並選擇Build Path -> Use as source folder

無論出於何種原因,maven沒有爲你做。

+0

我這樣做,但它不適合我。 –

+0

我更新目錄結構。 –

+0

它對我來說很好。嘗試2件事。右鍵點擊你的項目和'Maven - > Update Project'。然後做一個乾淨的重建。 –

0

maven在包裝過程中未找到屬性文件。通過生成war文件並提取war來驗證,並且應該在WEB-INF/classes文件夾中找到jdbc.properties。如果你沒有找到它,那麼問題是你pom.xml。

嘗試添加類似下面的烏爾建立

<build> 
<outputDirectory>${project.basedir}/target/classes</outputDirectory> 
     <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory> 
     <resources> 
      <resource> 
       <directory>${basedir}/src/main/java</directory> 
       <includes> 
        <include>**/*.class</include> 
       </includes> 
      </resource> 
      <resource> 
       <directory>${basedir}/src/main/resources/*</directory> 
      </resource> 
     </resources> 
</build> 
-1

我以前遇到過類似的問題,後來我解決了。如下圖所示:不要使用database.properties,直接在bean中寫入xml。

show in the image