2013-06-12 107 views
0

我在學習spring和bean的配置。將數據源添加到Jdbctemplate bean拋出異常

我將有幾個類將與數據庫相關的功能,所以他們每個人都需要有一個JdbcTemplate類。因爲我想創建一個bean配置,將注入一個單獨的JdbcTemplate類到我的數據庫相關的類中的每一個。

我創建了以下bean配置。

<bean id="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
    <property name="url" value="jdbc:mysql://localhost:3306/foo"/> 
    <property name="username" value="root"></property> 
    <property name="password" value="password"></property> 
     <property name="validationQuery" value="SELECT 1" /> 
    <property name="testOnBorrow" value="true" /> 
    <property name="testWhileIdle" value="true" /> 
    <property name="initialSize" value="5" /> 
</bean> 

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" scope="singleton"> 
<constructor-arg ref="dataSource"></constructor-arg> 
</bean> 

問題開始時我添加了constructor-args參數JdbcTemplate的。 jdbctemplate需要接收數據源作爲其構造函數的參數。但是當我添加該屬性並嘗試執行我的應用程序時,這是我得到的異常:

java.lang.IncompatibleClassChangeError: class org.springframework.core.LocalVariableTableParameterNameDiscoverer$ParameterNameDiscoveringVisitor has interface org.springframework.asm.ClassVisitor as super class 
java.lang.ClassLoader.defineClass1(Native Method) 
java.lang.ClassLoader.defineClass(ClassLoader.java:791) 
java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 
org.apache.catalina.loader.WebappClassLoader.findClassInternal(Unknown Source) 
org.apache.catalina.loader.WebappClassLoader.findClass(Unknown Source) 
org.apache.catalina.loader.WebappClassLoader.loadClass(Unknown Source) 
org.apache.catalina.loader.WebappClassLoader.loadClass(Unknown Source) 
org.springframework.core.LocalVariableTableParameterNameDiscoverer.inspectClass(LocalVariableTableParameterNameDiscoverer.java:112) 
org.springframework.core.LocalVariableTableParameterNameDiscoverer.getParameterNames(LocalVariableTableParameterNameDiscoverer.java:85) 
org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:193) 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1045) 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:949) 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:487) 
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458) 
org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295) 
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223) 
org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292) 
org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:626) 
org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913) 
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:464) 
org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139) 
org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83) 

我錯過了什麼?

謝謝!

+0

您的輸出與'context.xml'不匹配。沒有定義名爲'dataSource2'的bean –

+0

ooops我複製了錯誤的異常!修復它 – ufk

+0

這是類路徑問題 http://stackoverflow.com/questions/15758151/class-conflict-when-starting-up-java-project-classmetadatareadingvisitor-has-in –

回答

1

如果你想jdbcTemplate請試試代碼

<!-- DataSource configuration for Apache Commons DBCP. --> 
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" 
      p:driverClassName="${jdbc.driver}" p:url="${jdbc.url}" 
      p:username="${jdbc.username}" p:password="${jdbc.password}"/> 

<!--jdcb template for DB tests--> 
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.simple.SimpleJdbcTemplate"> 
     <constructor-arg type="javax.sql.DataSource" ref="dataSource"/> 
    </bean> 
0

的錯誤是,有一個JdbcTemplate tyring引用一個名爲「dataSource2」數據源...但你定義了一個名爲「數據源」

檢查所有的Spring上下文文件在應用程序中的JDBC模板看起來像:

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" scope="singleton"> 
<constructor-arg ref="dataSource2"></constructor-arg> 
</bean> 

也許你意外宣佈了兩個。如果沒有嘗試清爽的項目,清潔等

+0

我複製了錯誤的異常...修正它在poste – ufk

0

試試這個 Bean.xml

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> 

    <bean id="customerDAO" class="com.shreyansh.dao.impl.JdbcCustomerDAO"> 
     <property name="dataSource" ref="dataSource" /> 
    </bean> 

</beans> 

彈簧Datasource.xml

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> 

    <bean id="dataSource" 
     class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 

     <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
     <property name="url" value="jdbc:mysql://localhost:3306/shreyansh" /> 
     <property name="username" value="root" /> 
     <property name="password" value="password" /> 
    </bean> 

</beans> 

彈簧Module.xml

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> 

    <import resource="database/Spring-Datasource.xml" /> 
    <import resource="customer/Spring-Customer.xml" /> 

</beans> 
+0

謝謝你的答案,但我不太明白它在哪裏jdbctemplate在這裏? – ufk

0

正如你看到的錯誤 java.lang.IncompatibleClassChangeError。這是拋出 當不兼容的類變化而出現的一些類 definition.So,好像版本的問題,您試用版清單告訴的Java的哪個版本,你使用的是彈簧和系統。

+0

spring 3.2.3系統是linux gentoo。tomcat 7.0.39 – ufk

+0

java版本「1.7.0_09」IcedTea7 2.3.3 – ufk