关于Spring事务代理类型转换问题($ProxyXX cannot be cast to 类型)(二)

     紧接 上文 ....
2、解决方案
      后来在网上搜了一下,这样的问题不少,可是正真的解决方案并很少。参考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)
相关文章
相关标签/搜索