紧接 上文 ....
二、解决方案<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

      后来在网上搜了一下,这样的问题很多,但是正真的解决方案并不多。参考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)