spring 事务异常Failed to convert property value of type [$Proxy12] to required type

本文介绍了一个关于Spring框架中事务管理配置引起的问题,并详细解释了错误的原因及解决方案。通过调整AOP代理方式为CGLIB,确保了业务代码能够正确地引用到带有事务管理的DAO组件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<?xml version="1.0" encoding="GB2312"?>     
<beans xmlns="http://www.springframework.org/schema/beans"    
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
       xmlns:aop="http://www.springframework.org/schema/aop"    
       xmlns:tx="http://www.springframework.org/schema/tx"    
       xsi:schemaLocation="     
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd     
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd     
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">     
      

 <bean id="dataSource"
  class="org.apache.commons.dbcp.BasicDataSource">
  <property name="driverClassName"
   value="com.mysql.jdbc.Driver">
  </property>
  <!-- 现场字符集:?useUnicode=true&amp;characterEncoding=gb2312
   数据库如果是: utf-8 不需要转换
  -->
  <property name="url"
   value="jdbc:mysql://localhost:3306/jssms?useUnicode=true&amp;characterEncoding=gb2312">
  </property>
  <property name="username" value="root"></property>
  <property name="password" value="zmq"></property>
 </bean>
 
   
 
 <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource">
         <ref bean="dataSource"/>
        </property>
    </bean>
       
    <bean id="txManager"    
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">     
        <property name="dataSource" ref="dataSource"/> 
    </bean>     
         
    <tx:advice id="txAdvice" transaction-manager="txManager">     
        <tx:attributes>     
            <tx:method name="query*" propagation="REQUIRED" read-only="true" rollback-for="DataAccessException"/>     
            <tx:method name="*" propagation="REQUIRED" rollback-for="DataAccessException"/>     
        </tx:attributes>     
    </tx:advice>     
         
    <aop:config>     
        <aop:pointcut id="daoPointCut" expression="execution(* com.chemmade.adminbg.dao.impl..*.*(..))"/> 
        <aop:advisor advice-ref="txAdvice" pointcut-ref="daoPointCut"/>     
    </aop:config>      
  </beans>

 

。。。。

 

 <bean scope="prototype" id="adminDAO" class="com.chemmade.adminbg.dao.impl.AdminDAOImpl">
        <property name="jdbcTemplate">
   <ref bean="jdbcTemplate" />
  </property>
 </bean>
 
 <bean  scope="prototype" id="AdminLoginAction" class="com.chemmade.adminbg.action.AdminLoginAction">
  <property name="adminDAO">
   <ref local="adminDAO" />
  </property>
 </bean>

 

加入spring事务报如下异常:

严重: Servlet.service() for servlet default threw exception
org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessException details (1) are:
PropertyAccessException 1:
org.springframework.beans.TypeMismatchException: Failed to convert property value of type [$Proxy12] to required type [com.chemmade.adminbg.dao.impl.AdminDAOImpl] for property 'adminDAO'; nested exception is java.lang.IllegalArgumentException: Cannot convert value of type [$Proxy12] to required type [com.chemmade.adminbg.dao.impl.AdminDAOImpl] for property 'adminDAO': no matching editors or conversion strategy found
Caused by: java.lang.IllegalArgumentException: Cannot convert value of type [$Proxy12] to required type [com.chemmade.adminbg.dao.impl.AdminDAOImpl] for property 'adminDAO': no matching editors or conversion strategy found
 at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:231)
 at org.springframework.beans.TypeConverterDelegate.convertIfNecessary(TypeConverterDelegate.java:138)
 at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:815)
 at org.springframework.beans.BeanWrapperImpl.setPropertyValue(BeanWrapperImpl.java:648)
 ......

 

错误原因:

配置事务为adminDAOImpl生成了代理,所以在下面action中注入的将是代理对象(提示信息中的 [$Proxy12] )而不是原来的adminDAOImpl对象,这就产生了上面错误信息。

解决办法:

使用cgilib来实现AOP,定义proxy-target-class="true" ;proxy-target-class属性值决定是基于接口的还是基于类的代理被创建。如果proxy-target-class 属性值被设置为true,那么基于类的代理被创建,产生的代理对象会instanceof原来的类。

 

  <aop:config proxy-target-class="true">     
        <aop:pointcut id="daoPointCut" expression="execution(* com.chemmade.adminbg.dao.impl..*.*(..))" /> 
        <aop:advisor advice-ref="txAdvice" pointcut-ref="daoPointCut"/>     
    </aop:config>  

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值