BeanNotOfRequiredTypeException

  • Post author:
  • Post category:其他




解决:BeanNotOfRequiredTypeException

问题描述:在使用@Transactional注解处理事务(未使用AOP),在通过容器获取对象的时候出现了错误。

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService =  context.getBean("userService",UserServiceImpl.class);

userService:容器通过动态代理实现的对象,继承UserService接口

UserServiceImpl:是UserService接口的实现类

错误信息:

org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'userService' is expected to be of type 'com.rui.service.impl.UserServiceImpl' but was actually of type 'com.sun.proxy.$Proxy19'

问题分析:

  • 添加了事务,Spring容器会产生UserService类相应的代理对象
  • 默认采用的jdk的动态代理
  • jdk的动态代理机制,是实现同一个接口。代理对象为接口类型的数据
  • 代理对象与被代理对象属于兄弟关系,不能相互转化

问题解决方案:

getBean()时,声明bean的类型时,需要声明为接口类型。

若声明为被代理类UserServiceImpl类型,而代理类型为接口UserService类型。则无法转化

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService =  context.getBean("userService",UserService.class);



版权声明:本文为Always_moving原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。