【问题标题】:adding datasource to a Jdbctemplate bean throws exception将数据源添加到 Jdbctemplate bean 会引发异常
【发布时间】:2013-06-12 10:40:19
【问题描述】:

我正在尝试学习 spring 和 bean 配置。

我将有几个与 DB 相关的函数的类,所以它们中的每一个都需要有一个 JdbcTemplate 类。因此,我想创建一个 bean 配置,该配置将为我的每个 DB 相关类注入一个单例 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)

我错过了什么?

谢谢!

【问题讨论】:

  • 您的输出与context.xml 不匹配。没有定义名为“dataSource2”的 bean
  • 哎呀我复制了错误的异常!!!修复它
  • “当我将 constructor-args 参数添加到 jdbcTemplate 时,问题就开始了。jdbctemplate 需要接收数据源作为其构造函数的参数。但是当我添加该属性并尝试执行我的应用程序时这是我得到的例外:“你的意思是当你添加 或者当

标签: java spring spring-bean


【解决方案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>

【讨论】:

    【解决方案2】:

    错误是有一个 jdbcTemplate 试图引用一个名为“dataSource2”的数据源......但您定义了一个名为“dataSource”的数据源

    检查应用程序中的所有 spring 上下文文件中的 jdbc 模板,如下所示:

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

    也许你不小心声明了两个。如果不尝试刷新项目,清理等。

    【讨论】:

      【解决方案3】:

      试试这个 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>
      

      Spring-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>
      

      Spring-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>
      

      【讨论】:

      • 感谢您的回答。但我不太明白。 jdbctemplate 在哪里?
      【解决方案4】:

      看到你的错误 java.lang.IncompatibleClassChangeError 。这是抛出 当某个类发生不兼容的类更改时 定义。所以,似乎是版本问题。你能告诉你使用的是哪个版本的java,spring和system。

      【讨论】:

      • spring 3.2.3系统是linux gentoo。 Tomcat 7.0.39
      • java版本“1.7.0_09”IcedTea7 2.3.3
      猜你喜欢
      • 1970-01-01
      • 2019-06-26
      • 2017-01-13
      • 1970-01-01
      • 2017-12-07
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 2012-04-07
      相关资源
      最近更新 更多