关于Spring事务代理类型转换问题($ProxyXX cannot be cast to 类型)(
二、解决方案????? 后来在网上搜了一下,这样的问题很多,但是正真的解决方案并不多。参考http://mopishv0.blog.163.com/blog/static/54455932200911118572079写道????? spring的文档中这么写的:Spring AOP部分使用JDK动态代理或者CGLIB来为目标对象创建代理,如果被代理的目标对象实现了至少一个接口,则会使用JDK动态代理。所有该目标类型实现的接口都将被代理。若该目标对象没有实现任何接口,则创建一个CGLIB代理。使用beanNameAutoProxyCreator来进行事务代理的话,他的proxyTargetClass这个属性设置为false(默认是false),即使用JDK动态代理,如果你的service类没有实现接口的话,就会报类型转换错误。??? 解决办法有:?
????1、给service类添加一个接口iService,让service类实现它,则创建代理类时使用JDK动态代理就不会出现问题????2、设置beanNameAutoProxyCreator的proxyTargetClass属性为true,意思是强制使用CGLIB代理,前提是你已经将CGLIB包加入到项目中??? 推敲了很长时间,因为之前Spring事务用到的并不多,所以不是很了解。??? 第一种方法修改UserDao类也实现IDAO接口,但是没有解决。照样报错....????于是使用了第二种方案,修改了Spring事物配置信息,在原有的配置下加了一句配置如下:<!-- 配置事务操作 --><bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">??? <property name="sessionFactory" ref="sessionFactory" /></bean><tx:advice id="txAdvice" transactionmanager="transactionManager">??? <tx:attributes>??????? <tx:method name="add*" propagation="REQUIRED" />????????<tx:method name="insert*" propagation="REQUIRED" />????????<tx:method name="delete*" propagation="REQUIRED" />????????<tx:method name="update*" propagation="REQUIRED" />????????<tx:method name="find*" read-only="false" propagation="SUPPORTS" />????????<tx:method name="select*" read-only="false" propagation="SUPPORTS" />??? </tx:attributes></tx:advice><aop:config>??? <aop:pointcut id="point" expression="execution(* com.dao.*.*(..))" />??? <aop:advisor advice-ref="txAdvice" pointcut-ref="point" /></aop:config><!--?注意下面的配置 --><aop:aspectj-autoproxy proxy-target-class="true"/>???? 注意:最后一行配置信息。???? 这样之后就解决了,而且测试结果如下: INFO [STDOUT] com.dao.UserDao@13ba812
INFO [STDOUT] true
INFO [STDOUT] true
INFO [STDOUT] true?? 又学了一招,很好很强大。。。接着要好好研究一下JDK动态代理和CGLIB代理(cglib.jar和asm.jar)