关于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、设置beanNameAutoProxyCreatorproxyTargetClass属性为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.jarasm.jar)

猜你喜欢

转载自qsfwy.iteye.com/blog/1677191