我尝试像这样https://stackoverflow.com/a/511417为通用DAO实现解决方案。
但是,对于“在没有特殊实现类的情况下使用此genericDAO”情况,我得到了NoSuchBeanDefinitionException。

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

如我所见,没有特殊的实现类,Spring无法为Generic Dao连接bean

https://dl.dropboxusercontent.com/u/8384811/Misc/2013-05-14_224944.jpg
Spring使用JdkDynamicAopProxy来连接BranchHibernateDao类,“在特殊实现类中使用此genericDAO”情况。

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

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

但是,它无法连接branchGenericDao(“在没有特殊实现类的情况下使用此genericDAO”情况),并且看不到Crud接口方法。

我将不胜感激!

豆的接线

<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

原始来源在这里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测试运行程序。尝试修改测试以使其更像this,或者尝试实际实施它,而不使用测试框架来查看它是否有效。

另外,如果您要创建通用的dao,并且使用的是Hibernate,则应真正研究Spring Data JPA。使用它可以使您的生活比做您想做的事容易10倍,因为它可以完成您想做的事,但是比您自己可以实现的工作量少,选择更好。

(您遵循的答案早于Spring Data。我敢肯定,如果存在,他们会使用Spring Data。)

09-11 21:31