SpringMVC集成Hibernate时BeanNotOfRequiredTypeException异常求助
问题根源
你的HibernateStudentDao实现了StudentDao接口,当Spring通过AOP(比如事务管理的@Transactional注解)生成代理时,默认采用JDK动态代理——这种代理是基于接口实现的,生成的代理类(如jdk.proxy3.$Proxy64)仅实现了StudentDao接口,并非HibernateStudentDao的子类。因此当你用HibernateStudentDao具体类型注入Bean时,就会出现类型不匹配错误。
解决方案
1. 优先使用接口类型注入(推荐)
将依赖注入的类型从具体类HibernateStudentDao改为接口StudentDao,符合面向接口编程原则,同时避免代理类型冲突。
示例修改:
// 原错误写法 @Autowired private HibernateStudentDao hibernateStudentDao; // 修改后 @Autowired private StudentDao hibernateStudentDao;
2. 强制使用CGLIB类代理
如果必须用具体类注入,可配置Spring使用CGLIB代理(基于子类的代理),生成的代理类是HibernateStudentDao的子类,能匹配具体类型。
XML配置方式
<!-- 开启AspectJ自动代理并强制使用类代理 --> <aop:aspectj-autoproxy proxy-target-class="true"/> <!-- 事务驱动也需开启类代理 --> <tx:annotation-driven proxy-target-class="true"/>
Java配置类方式
@Configuration @EnableAspectJAutoProxy(proxyTargetClass = true) @EnableTransactionManagement(proxyTargetClass = true) public class SpringConfig { // 其他配置代码... }
注意:使用CGLIB代理时,HibernateStudentDao不能是final类,被代理的方法也不能是final方法,且构造方法需为public。
3. 移除不必要的AOP代理
若你的HibernateStudentDao不需要事务管理或其他AOP增强,可去掉类上的@Transactional等AOP相关注解,Spring将直接创建原始类实例作为Bean,不会生成代理。
内容的提问来源于stack exchange,提问作者gexter
相关产品推荐
相关产品推荐

