我有两个独立的项目。一个项目包含我的应用程序逻辑和控制器org.patrick.application
,另一个单独的项目包含我的 Hibernate 实体、Dao 和org.patrick.hibernate
中的模型。我的问题是 Spring 不会为我的CrudRepository
实例化一个实现类。
以下是我在应用程序项目中Application.java
类注释:
package org.patrick.application;
@SpringBootApplication
@Configuration
@EnableAutoConfiguration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = { "org.patrick.hibernate" })
@EntityScan(basePackages = { "org.patrick.hibernate" })
@ComponentScan(basePackages = { "org.patrick.hibernate", "org.patrick.application" })
这些注释应该扫描我的第二个 Hibernate 项目以查找我所有的 Hibernate 对象。
我的休眠存储库如下所示:
package org.patrick.hibernate;
@Repository
public interface PatrickDao extends CrudRepository<MyModel, Long>
此存储库没有类实现。我期待 Spring 为我填充此实现。
现在,在我的应用程序org.patrick.application
中,我正在尝试像这样使用 Dao:
package org.patrick.application;
@Autowired
private PatrickDao patrickDao;
这导致我的应用程序项目由于以下错误而无法启动:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean found for dependency [org.patrick.hibernate.PatrickDao]: expected at least 1 bean which qualifies as autowire candidate.
我知道核心问题是 Spring 没有实现这个接口—— 因为如果我在org.patrick.hibernate
包中提供自己的PatrickDaoImpl
,那么应用程序项目将正常启动。这让我感到困惑,因为我在Application.java
类上有正确的注释,但由于某种原因,Spring无法实现存储库。
为了让 Spring 为我的存储库接口实现该类,我还需要做什么吗?在以前的测试中,如果所有内容都在同一包下,则此行为有效。
我发现了问题。对于此特定模型,定义如下所示:
package org.patrick.hibernate;
public class MyModel implements Serializable {}
此模型没有@Entity
注释。如果缺少此注释,则 Spring 不会给出任何警告,说明为什么它无法实现存储库接口。就我而言,它只是抛出了NoSuchBeanDefinitionException
异常。
我用正确的注释更新了我的模型:
package org.patrick.hibernate;
@Entity
public class MyModel implements Serializable {}