弹簧无法接线豆"Generic Dao without special implementation class"的情况



我尝试像这样实现泛型DAO的解决方案https://stackoverflow.com/a/511417。然而,对于"使用这个泛型dao没有特殊的实现类"的情况下,我得到NoSuchBeanDefinitionException。

完整的堆栈跟踪http://pastebin.com/HwrjEZiX

如果没有特殊的实现类,Spring不能为泛型Dao连接bean

https://dl.dropboxusercontent.com/u/8384811/Misc/2013-05-14_224944.jpgSpring使用JdkDynamicAopProxy来连接branchhibernatdao类,"使用这个genericDAO与特殊实现类"的情况。

根据JavaDoc,它创建一个动态代理,实现由* AopProxy。动态代理不能用于代理方法定义在类中,而不是在接口中。

因此它看到了用于branchDao bean定义的BrunchDao和Crud接口的方法。

然而,它不能连接branchGenericDao("使用这个genericDAO没有特殊的实现类"的情况),也看不到Crud接口方法。

我将感谢任何帮助!

Bean的布线

<bean id="branchDao" class="org.jtalks.poulpe.model.dao.hibernate.BranchHibernateDao" parent="genericDao"/>
<bean id="branchGenericDao" class="org.jtalks.common.model.dao.hibernate.GenericDao">
<qualifier value="branchGenericDao"/>
<constructor-arg name="sessionFactory" ref="sessionFactory"/>
<constructor-arg name="type" value="org.jtalks.poulpe.model.entity.PoulpeBranch"/>
</bean>
<bean id="genericDao" abstract="true" class="org.jtalks.common.model.dao.hibernate.GenericDao">
<constructor-arg name="sessionFactory" ref="sessionFactory"/>
</bean>

测试源代码在这里https://github.com/jtalks-org/poulpe/blob/master.senleft/poulpe-model/src/test/java/org/jtalks/poulpe/model/dao/hibernate/BranchHibernateDaoTest.java

Crud源在这里https://github.com/jtalks-org/jtalks-common/blob/master.senleft/jtalks-common-model/src/main/java/org/jtalks/common/model/dao/Crud.java

GenericDao源代码在这里https://github.com/jtalks-org/jtalks-common/blob/master.senleft/jtalks-common-model/src/main/java/org/jtalks/common/model/dao/hibernate/GenericDao.java

BranchHibernateDao源代码在这里https://github.com/jtalks-org/poulpe/blob/master.senleft/poulpe-model/src/main/java/org/jtalks/poulpe/model/dao/hibernate/BranchHibernateDao.java

问题可能出在你的测试上。当您使用Spring编写测试时,必须使用适当的Spring测试运行器。试着修改你的测试,让它更像这样工作,或者试着实际实现它,而不是用测试框架来做,看看它是否有效。

另外,如果你想创建通用的dao,并且你正在使用Hibernate,你应该认真研究Spring Data JPA。使用它会让你的生活比做你想做的事情容易10倍,因为它做了你想做的事情,但比你自己能实现的工作少,选择多。

(您所遵循的答案早于春季数据。我相信他们会使用Spring Data,如果它存在的话)

最新更新