有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java NotWritablePropertyException:Bean属性“dataSource”不可写或具有无效的setter方法

我正在我的应用程序服务层中实现Spring事务

我指的是关于实现spring事务的编程方式的教程点上的示例

https://www.tutorialspoint.com/spring/programmatic_management.htm

我跟踪了每个&;那边提到的每一步。。。。但是在xml文件中创建bean时遇到了问题

错误:

线程“main”组织中出现异常。springframework。豆。工厂BeanCreationException:创建名为“transactionManager”的bean时出错,该bean在类路径资源[database/spring.xml]中定义:设置属性值时出错;嵌套的异常是org。springframework。豆。NotWritablePropertyException:bean类[org.springframework.jdbc.dataSource.dataSource TransactionManager]的属性“dataSource”无效:bean属性“dataSource”不可写或具有无效的setter方法。setter的参数类型与getter的返回类型匹配吗

系统及;应用程序配置: 操作系统:ubuntu 16.0.4 弹簧版本:-5.0.3 雄猫:9 jdk:1.9
IDE:EclipseOxygen3

如果有人能给我解决方案,那将对我非常有帮助

<?xml version="1.0" encoding="UTF-8"?>
    <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">

       <!-- ********************* Initialization for Inventory database -->

         <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/myDatabase" />
            <property name="username" value="root" />
            <property name="password" value="root" />
        </bean>

        <!--*********************  Initialization for TransactionManager -->
        <bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager" id="transactionManager">
          <property name="dataSource" ref="dataSource"></property>    
       </bean> 

    </beans>


public class MyService implements InventoryServiceIface{

    private MyDAO dao;

    private PlatformTransactionManager transactionManager;

    public void setTransactionManager(PlatformTransactionManager transactionManager) {

        this.transactionManager = transactionManager;
    }

    public void setDAO(MyDAO dao) {

        this.dao = dao;
    }


    public Student saveStudent(Student tudent) throws ServiceException{

              validate(Student); // validate the data inside party object 

              TransactionStatus status = beginTransaction(); // begin database transaction

              try 
              {
                  rollbackTransaction();
                  Student =  dao.saveStudent(student); 
              }
              catch(ServiceException e)
              {
                   rollbackTransaction(status);
                   throw e;
              }
              catch(Exception e)
              {
                   rollbackTransaction(status);
                   throw new ServiceException(e);
              }

               commitTransaction(status);

          return student;
    }

    public TransactionStatus beginTransaction()

    {
        System.out.println("TRANSACTION BEGINS....");
        return transactionManager.getTransaction(new DefaultTransactionDefinition());

    }

    public void rollbackTransaction(TransactionStatus status)

    {
        System.out.println("ROLL BACK....");
        transactionManager.rollback(status);

    }

    public void commitTransaction(TransactionStatus status)

    {
        System.out.println("TRANSACTION COMMITTED....");
        transactionManager.commit(status);

    }

}// End of Class

共 (1) 个答案

  1. # 1 楼答案

    设置数据源的DataSourceTransactionManager的属性名写在stacktrace数据源中,而不是XXXXX数据源中。你的配置应该如下

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