二、解决方案
后来在网上搜了一下,这样的问题很多,但是正真的解决方案并不多。参考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动态代理就不会出现问题
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"/>
注意:最后一行配置信息。
这样之后就解决了,而且测试结果如下:
又学了一招,很好很强大。。。接着要好好研究一下JDK动态代理和CGLIB代理(cglib.jar和asm.jar)