3

我尝试像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

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

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

4

1 回答 1

0

问题可能与您的测试有关。当您使用 Spring 编写测试时,您必须使用正确的 Spring 测试运行器。尝试修改您的测试以使其更像这样工作,或者尝试实际实现它而不是使用测试框架来查看它是否有效。

此外,如果您想创建通用 daos 并且您正在使用 Hibernate,您应该真正查看Spring Data JPA。使用它将使您的生活比做您想做的事情容易 10 倍,因为它可以做您想做的事情,但工作量更少,选项也比您自己能够实现的更好。

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

于 2013-05-16T08:18:33.927 回答