Spring编程式事务实现遇Bean创建错误:dataSource属性不可写
解决Spring事务管理器Bean创建时的NotWritablePropertyException问题
看起来你在配置Spring编程式事务的transactionManager Bean时踩了个常见的坑,NotWritablePropertyException的核心原因就是Spring没法找到对应属性的有效setter方法,或者你配置的属性本身就不属于这个Bean类。下面一步步帮你排查和解决:
1. 确认你用对了TransactionManager实现类
首先,不同的事务场景需要对应不同的TransactionManager:
- 如果你是基于JDBC的事务,必须用
org.springframework.jdbc.datasource.DataSourceTransactionManager——这个类明确需要dataSource属性,并且自带setDataSource()方法。 - 如果你误用了其他实现类(比如
JtaTransactionManager),它本身就没有dataSource属性,Spring自然会报错说这个属性不可写。
2. 检查XML配置的正确性
确保你的XML配置里,transactionManager的类和属性引用都正确:
<!-- 首先配置你的数据源 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/your_database"/> <property name="username" value="db_user"/> <property name="password" value="db_password"/> </bean> <!-- 配置正确的TransactionManager --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- 注意属性名是驼峰的dataSource,不是datasource或者DataSource --> <property name="dataSource" ref="dataSource"/> </bean>
3. 排查属性名和setter方法的匹配问题
- 检查XML里的
property name是不是严格对应类的setter方法:比如dataSource对应setDataSource(DataSource ds),如果写成datasource(小写d),Spring会找setDatasource()方法,自然找不到。 - 如果是你自定义的TransactionManager类,必须手动添加
public void setDataSource(DataSource dataSource)方法,Spring依赖setter注入属性。
4. 其他可能的排查方向
- 如果你用的是Hibernate或MyBatis等ORM框架,对应的TransactionManager是
HibernateTransactionManager或SqlSessionFactoryTransactionManager,它们需要的属性是sessionFactory或sqlSessionFactory,而不是dataSource,别搞混了。 - 可以在代码里打印ApplicationContext的Bean定义,或者用IDE的Spring插件查看Bean的属性列表,确认
transactionManager的属性是否包含dataSource。
按照上面的步骤排查,应该能解决这个Bean创建的错误。
内容的提问来源于stack exchange,提问作者rahul shalgar 2
相关产品推荐
相关产品推荐

