关于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)

你可能感兴趣的:(职场,休闲)