0

我正在尝试运行/设置一个简单的 Spring MVC 3 + Hibernate + Apache Tomcat 7.0,使用 NetBeans 7.1 作为开发环境。

Netbeans 带有预先打包的 Spring 和 Hibernate 文件/jars/依赖项,这些文件/jars/依赖项已经设置在正确的目录结构中。

为了在 applicationContext 中设置数据源 bean,我有 2 个选择


变体 #1 (使用数据源类=“org.springframework.jdbc.datasource.DriverManagerDataSource”,它是用于 Spring 开发的 NetBeans 预打包数据源)

来自 applicationContext.xml 的片段

<!-- Declare a datasource that has pooling capabilities-->  
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"    
destroy-method="close"    p:driverClass="com.mysql.jdbc.Driver"    
p:jdbcUrl="jdbc:mysql://localhost:3306/yourmarketnet"   
p:user="root"    
p:password="arya6678"   
p:acquireIncrement="5"    
p:idleConnectionTestPeriod="60"    
p:maxPoolSize="100"    
p:maxStatements="50"    
p:minPoolSize="10" /> 
<!-- Declare the Hibernate SessionFactory for retrieving Hibernate sessions -->   
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">    
<property name="dataSource" ref="dataSource"/>    
<property name="configLocation" ref="classpath:hibernate.cfg.xml"/>    
<property name="packagesToScan" value="com.yourmarketnet.*" />
</bean>

变体 2,错误结果:我的应用程序无法运行,Apache Tomcat 日志:

org.springframework.beans.factory.BeanCreationException:创建 ServletContext 资源 [/WEB-INF/applicationContext.xml] 中定义的名称为“dataSource”的 bean 时出错:设置属性值时出错;嵌套异常是 org.springframework.beans.NotWritablePropertyException:bean 类 [org.springframework.jdbc.datasource.DriverManagerDataSource] 的无效属性“acquireIncrement”:Bean 属性“acquireIncrement”不可写或设置方法无效。setter 的参数类型是否与 getter 的返回类型匹配?在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1361) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java: 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) 在 java.util.concurrent.FutureTask.run(FutureTask.java:166) 在 java.util.concurrent 调用(StandardContext.java:5221) .ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) at java.lang.Thread.run(Thread.java:722) 由:org。 springframework.beans.NotWritablePropertyException:bean 类 [org.springframework.jdbc.datasource.DriverManagerDataSource] 的属性“acquireIncrement”无效:Bean 属性“acquireIncrement”不可写或设置方法无效。setter 的参数类型是否与 getter 的返回类型匹配?在 org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:1052) 在 org.

Variation #2
(using data source class="org.apache.commons.dbcp.BasicDataSource") 然后我决定下载 Apache Commons dbcp jar,并将“commons-dbcp-1.4.jar”添加到我的项目中。

来自 applicationContext.xml 的片段

<!-- Declare a datasource that has pooling capabilities-->  
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"    
destroy-method="close"    p:driverClass="com.mysql.jdbc.Driver"    
p:jdbcUrl="jdbc:mysql://localhost:3306/yourmarketnet"   
p:user="root"    
p:password="arya6678"   
p:acquireIncrement="5"    
p:idleConnectionTestPeriod="60"    
p:maxPoolSize="100"    
p:maxStatements="50"    
p:minPoolSize="10" /> 
<!-- Declare the Hibernate SessionFactory for retrieving Hibernate sessions -->   
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">    
<property name="dataSource" ref="dataSource"/>    
<property name="configLocation" ref="classpath:hibernate.cfg.xml"/>    
<property name="packagesToScan" value="com.yourmarketnet.*" />
</bean>

变体 2,错误结果:我的应用程序无法运行,Apache Tomcat 日志:

org.springframework.beans.factory.BeanCreationException:创建 ServletContext 资源 [/WEB-INF/applicationContext.xml] 中定义的名称为“dataSource”的 bean 时出错:设置属性值时出错;嵌套异常是 org.springframework.beans.NotWritablePropertyException:bean 类 [org.apache.commons.dbcp.BasicDataSource] 的无效属性“acquireIncrement”:Bean 属性“acquireIncrement”不可写或具有无效的 setter 方法。setter 的参数类型是否与 getter 的返回类型匹配?在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1361) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1086) 在 org. concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) 在 java.util.concurrent.FutureTask.run(FutureTask.java:166) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 在 java .util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) at java.lang.Thread.run(Thread.java:722) 原因:org.springframework.beans.NotWritablePropertyException:bean 的无效属性“acquireIncrement”类 [org.apache.commons.dbcp.BasicDataSource]:Bean 属性“acquireIncrement”不可写或设置方法无效。setter 的参数类型是否与 getter 的返回类型匹配?在 org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:1052) 在 org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:

4

2 回答 2

0

您是否有特定的问题,或者您只是不理解错误?消息非常清楚:acquireIncrement 不是您尝试设置的类的属性。我相信该属性来自 C3P0 连接池。

于 2012-05-22T21:20:02.930 回答
0

p 命名空间 ( p:user, p:password, p:acquireIncrement) 用于设置 Java bean 的属性。看起来您正在尝试在和类上设置acquireIncrement属性。根据这些类的文档(Apache Commons DBCPSpring 的数据源),它们都没有这个属性的 setter 方法,这就是你在堆栈跟踪中看到 NotWritablePropertyException 的原因。org.apache.commons.dbcp.BasicDataSourceorg.springframework.jdbc.datasource.DriverManagerDataSource

查看Spring 的有关 p-namespace配置的文档。

如果我选择的话,我会选择 Apache 的数据库连接池 (dbcp)。简单又好用。

于 2012-05-22T21:25:34.037 回答