我有两个独立的项目。一个项目在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对象。
我的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;
由于以下错误,导致我的Application项目无法启动:
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没有实现这个接口 -
因为如果我在PatrickDaoImpl
包中提供我自己的org.patrick.hibernate
,那么Application项目就会正常启动。这让我感到困惑,因为我在Application.java
类上有正确的注释,但由于某种原因,Spring无法实现存储库。
为了让Spring为我的Repository接口实现类,我还需要做些什么吗?在以前的测试中,如果所有内容都在同一个包中,则此行为有效。
答案 0 :(得分:0)
我发现了问题。对于这个特定的模型,定义如下:
package org.patrick.hibernate;
public class MyModel implements Serializable {}
此模型没有@Entity
注释。如果缺少这个注释,那么Spring将不会警告为什么它不能实现存储库接口。就我而言,它只是抛出NoSuchBeanDefinitionException
例外。
我使用正确的注释更新了我的模型:
package org.patrick.hibernate;
@Entity
public class MyModel implements Serializable {}