`
足至迹留
  • 浏览: 495624 次
  • 性别: Icon_minigender_1
  • 来自: OnePiece
社区版块
存档分类
最新评论

<spring-aop> BeanNotOfRequiredTypeException 切面异常

阅读更多
1. 问题描述
往工程里添加切面,定义了<aop:aspectj-autoproxy/>,切的是实现了接口的类,这样的话使用jdk代理应该没啥问题。但是启动时报错:
BeanNotOfRequiredTypeException
org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'x' must be of type [y], but was actually of type [com.sun.proxy.$Proxy23]


2. 问题分析
这个异常一般是代理问题,根据异常中的com.sun.proxy.$Proxy23可以判断。但是奇怪的是为什么会类型不对,动态代理接口应该没有问题,于是查找工程中其他地方是否也使用了代理相关的功能。
1)因为有好几个spring配置文件,就搜索有没有其他<tx:annotation-driven/>, <aop:aspectj-autoproxy/> 或<aop:config/>,如果有的话就看下是否有proxy-target-class="true"的配置  ---结果没有
2)查看是否有注解@Transactional的使用 -- 找到
发现@Transactional是加在**DAO方法上的,但是这个DAO没有实现接口,而是继承的父DAO类。问题明确了,动态代理只能代理实现了接口且是接口里定义的方法,否则就会强制使用cglib代理。即使DAO类实现的是接口,但@Transactional加在了不是接口里定义的方法上,仍然会走cglib代理,本人遇到的就是这个问题。

根据spring的讲解(http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html#aop-proxying):
引用
Multiple <aop:config/> sections are collapsed into a single unified auto-proxy creator at runtime, which applies the strongest proxy settings that any of the <aop:config/> sections (typically from different XML bean definition files) specified. This also applies to the <tx:annotation-driven/> and <aop:aspectj-autoproxy/> elements.
To be clear: using ' proxy-target-class="true"' on <tx:annotation-driven/>, <aop:aspectj-autoproxy/> or <aop:config/> elements will force the use of CGLIB proxies for all three of them.
So be careful when defining these tags in multiple xml configuration files.

所以就强制所有代理都使用了cglib。cglib代理后生成的类型是类,不能转成接口,这里期待的类型也是类,但新增的切面仍然使用了<aop:aspectj-autoproxy/>的配置,jdk代理。这个代理类类型与期待的接口的实现类类型不符合,造成异常。

3. 解决办法
显式加上proxy-target-class="true",配置成<aop:aspectj-autoproxy proxy-target-class="true"/>

可以参考:
官方: https://jira.spring.io/browse/SPR-11859
http://jinnianshilongnian.iteye.com/blog/1901694
http://jinnianshilongnian.iteye.com/blog/1894465

补充:
spring @Transactional代理注意事项:
@Transactional 的事务开启 ,或者是基于接口的 或者是基于类的代理被创建。所以在同一个类中一个方法调用另一个方法有事务的方法,事务是不会起作用的。
更多事项参考:http://blog.sina.com.cn/s/blog_667ac0360102ebem.html
2
2
分享到:
评论

相关推荐

    spring-aop.jar各个版本

    spring-aop-1.1.1.jar spring-aop-1.2.6.jar spring-aop-1.2.9.jar spring-aop-2.0.2.jar spring-aop-2.0.6.jar spring-aop-2.0.7.jar spring-aop-2.0.8.jar spring-aop-2.0.jar spring-aop-2.5.1.jar spring-aop-...

    开发工具 spring-aop-4.3.6.RELEASE

    开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE开发工具 spring-aop-4.3.6.RELEASE...

    spring-aop-5.2.0.RELEASE-API文档-中文版.zip

    赠送jar包:spring-aop-5.2.0.RELEASE.jar; 赠送原API文档:spring-aop-5.2.0.RELEASE-javadoc.jar; 赠送源代码:spring-aop-5.2.0.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-aop-5.2.0.RELEASE.pom;...

    spring-aop-jar

    总结起来,"spring-aop-jar"涉及了Spring框架中的面向切面编程模块,包括Spring AOP和AspectJ的集成。通过理解和熟练使用这些组件,开发者可以有效地解耦关注点,提高代码的可维护性和可扩展性。在实际项目中,结合...

    spring-aop-5.0.8.RELEASE-API文档-中英对照版.zip

    赠送jar包:spring-aop-5.0.8.RELEASE.jar; 赠送原API文档:spring-aop-5.0.8.RELEASE-javadoc.jar; 赠送源代码:spring-aop-5.0.8.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-aop-5.0.8.RELEASE.pom;...

    spring aop注解方式、xml方式示例

    在XML配置中,我们创建一个`&lt;aop:config&gt;`元素,并定义`&lt;aop:aspect&gt;`子元素来声明切面: ```xml &lt;aop:config&gt; &lt;aop:aspect id="loggingAspect" ref="loggingAspectBean"&gt; &lt;!-- ... --&gt; &lt;/aop:aspect&gt; &lt;/aop:...

    spring-aop-5.0.10.RELEASE-API文档-中文版.zip

    赠送jar包:spring-aop-5.0.10.RELEASE.jar; 赠送原API文档:spring-aop-5.0.10.RELEASE-javadoc.jar; 赠送源代码:spring-aop-5.0.10.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-aop-5.0.10.RELEASE....

    spring-aop-5.3.10-API文档-中文版.zip

    赠送jar包:spring-aop-5.3.10.jar; 赠送原API文档:spring-aop-5.3.10-javadoc.jar; 赠送源代码:spring-aop-5.3.10-sources.jar; 赠送Maven依赖信息文件:spring-aop-5.3.10.pom; 包含翻译后的API文档:spring...

    spring,spring-aop-5.3.22.jar+aop+IDEA本地包

    spring-aop-5.3.22.jar Spring AOP provides an Alliance-compliant aspect-oriented programming implementation allowing you to define method interceptors and pointcuts to cleanly decouple code that ...

    spring-aop-6.0.2.jar

    spring-aop-6.0.2.jar

    spring-aop-5.3.12-API文档-中英对照版.zip

    赠送jar包:spring-aop-5.3.12.jar; 赠送原API文档:spring-aop-5.3.12-javadoc.jar; 赠送源代码:spring-aop-5.3.12-sources.jar; 赠送Maven依赖信息文件:spring-aop-5.3.12.pom; 包含翻译后的API文档:spring...

    spring-aop-5.2.0.RELEASE.jar

    spring-aop-5.2.0.RELEASE

    spring-aop-5.2.15.RELEASE-API文档-中文版.zip

    赠送jar包:spring-aop-5.2.15.RELEASE.jar; 赠送原API文档:spring-aop-5.2.15.RELEASE-javadoc.jar; 赠送源代码:spring-aop-5.2.15.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-aop-5.2.15.RELEASE....

    spring-aop-3.2.5.RELEASE.jar ;spring-aop-3.2.5.jar

    spring-aop-3.2.5.RELEASE.jar

    spring-aop-3.2.0.RELEASE.jar

    spring-aop-3.2.0.RELEASE.jar,一个Spring中AOP的jar包

    spring-aop-5.1.3.RELEASE-API文档-中英对照版.zip

    赠送jar包:spring-aop-5.1.3.RELEASE.jar; 赠送原API文档:spring-aop-5.1.3.RELEASE-javadoc.jar; 赠送源代码:spring-aop-5.1.3.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-aop-5.1.3.RELEASE.pom;...

    spring-aop-4.3.20.RELEASE-API文档-中英对照版.zip

    赠送jar包:spring-aop-4.3.20.RELEASE.jar 赠送原API文档:spring-aop-4.3.20.RELEASE-javadoc.jar 赠送源代码:spring-aop-4.3.20.RELEASE-sources.jar 包含翻译后的API文档:spring-aop-4.3.20.RELEASE-...

    spring-aop-4.0.4.RELEASE

    spring-aop-4.0.4.RELEASE 的jar包,亲测可用。。。。

    spring-aop.jar

    spring-aop.jarspring-aop.jarspring-aop.jarspring-aop.jarspring-aop.jarspring-aop.jarspring-aop.jarspring-aop.jarspring-aop.jarspring-aop.jar

    spring-aop-5.0.4.RELEASE.jar

    spring-aop-5.0.4.RELEASE.jar。

Global site tag (gtag.js) - Google Analytics