尽管有 @EnableJpaRepositories 注释,但 Spring JPA 未实现/自动装配存储库

Posted

技术标签:

【中文标题】尽管有 @EnableJpaRepositories 注释,但 Spring JPA 未实现/自动装配存储库【英文标题】:Spring JPA not implementing/autowiring repository despite @EnableJpaRepositories annotation 【发布时间】:2017-02-28 08:31:15 【问题描述】:

我在启动应用程序时遇到异常,Spring 抱怨 UnsatisfiedDependencyException:

Exception in thread "main" org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'applicationConfig': Unsatisfied dependency expressed through field 'controlRepository'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean found for dependency [com.oak.api.finance.repository.ControlRepository]: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: @org.springframework.beans.factory.annotation.Autowired(required=true)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:569)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)

我的应用程序以这种格式组织:

    我用正确的 Spring JPA 注释声明了我的存储库接口:

    @RepositoryRestResource(collectionResourceRel = "exchange", path = "exchanges")
    public interface ControlRepository extends PagingAndSortingRepository<Control, Long>  
    
    

    我注释了包含main 方法的EntryPoint

    @SpringBootApplication
    @EntityScan(basePackages = "com.oak.api.finance.model.dto")
    @EnableJpaRepositories(basePackages = "com.oak.api.finance.repository")
    public class EntryPoint 
        public static void main(String[] args) 
            Logger logger = LogManager.getLogger(EntryPoint.class);
            logger.info("Starting application");
    
            ApplicationContext ctx = new AnnotationConfigApplicationContext(ApplicationConfig.class);
    //      SpringApplication.run(EntryPoint.class, args);
    
            ctx.getBean(ApplicationServer.class).start();
        
    

    我使用@Autowired 将我的存储库注入我的spring config(基于java)ApplicationConfig 类:

    @Autowired 
    private ControlRepository controlRepository;
    @Autowired
    private CompanyRepository companyRepository;
    @Autowired
    private SectorRepository sectorRepository;
    

基本上我想控制对 Spring 的依赖并将其限制为几个包(存储库、java 配置和程序入口点 - EntryPoint)

我假设,通过在我的存储库所在的包中指定@EnableJpaRepositories,spring 将为我的存储库创建一个代理并实例化一个实例,并且在我调用时:

    ApplicationContext ctx = new AnnotationConfigApplicationContext(ApplicationConfig.class)

存储库实例将存在于 bean 池中,并且可以将它们自动装配到我的 ApplicationConfig 上下文中,然后将它们注入到我的控制器中。

这显然没有发生,Spring 抱怨缺少要自动装配的 Bean,但我不确定我缺少什么。

下面是我的包裹快照: 有任何想法吗?

【问题讨论】:

Control 类在哪个包中。您将实体扫描设置为 model.dto,这对我来说似乎很奇怪。 控制类以及其他实体类位于:com.oak.api.finance.model.dto ,dto 是我放置所有实体类的位置.. 添加 SpringApplication.run(EntryPoint.class);记录后删除 ApplicationContext 部分。确保您的 ApplicationConfig 类使用 @Configuration 注释 当我停止尝试创建ApplicationContext(来自ApplicationConfig)时,它可以工作,直到我需要掌握ApplicationServer bean(类@ 987654336@),在其上调用 start()。我使用@ComponentScan 指向ApplicationConfig,我可以看到我的bean 已实例化。但是如果我尝试@Autowired ApplicationServer app; 它不会被注入,如果我打电话给start() 我会得到NullPointerException 实现 CommandLineRunner 接口。自动装配的 bean 应该在 run 方法中可用。哦,我只是看到你的包结构很奇怪。您需要将组件扫描设置为 com.oak -> @SpringBootApplication 的 scanBasePackages 参数 【参考方案1】:

我的猜测是您的存储库没有被扫描,因此没有创建 bean。您可以尝试删除这两个注释

@EntityScan(basePackages = "com.oak.api.finance.model.dto")
@EnableJpaRepositories(basePackages = "com.oak.api.finance.repository")

并且只保留@SpringBootApplication。如果这不起作用,您可能需要检查包结构(如果可能,请在此处粘贴屏幕截图)

编辑 1

@SpringBootApplication替换为

@Configuration
@EnableAutoConfiguration
@ComponentScan("com.oak")

编辑2

使用

 new SpringApplicationBuilder() 
        .sources(SpringBootApp.class) 
        .web(false) 
        .run(args); 

或者按照 mh-dev 的建议将 ComponentScan 路径更改为“com.oak”后使用 CommandLineRunner

【讨论】:

不幸的是,这并没有解决问题。我正在尝试将所有内容都放在 github 中,如果结果很复杂,我将尝试使用屏幕截图。 (我以为它已经在 github 上,但看起来我创建了一个本地分支 - 不知道如何将它放在 github 上,我会看到) 好的我现在无法整理github,我添加了截图 我认为这是问题所在。 ***.com/questions/33619532/… 解决方案:由于你的包结构是非传统的,我会将“@SpringbootApplication”注释替换为'@Configuration,@EnableAutoConfiguration 和@ComponentScan("com.oak")'...跨度> 只有当我停止尝试创建ApplicationContext(来自ApplicationConfig)时才有效,直到我需要掌握ApplicationServer bean,调用@ 987654330@就可以了。我使用@ComponentScan 指向ApplicationConfig,我可以看到我的bean 已实例化。但是如果我尝试@Autowired ApplicationServer app; 它不会被注入,如果我打电话给start() 我会得到NullPointerException

以上是关于尽管有 @EnableJpaRepositories 注释,但 Spring JPA 未实现/自动装配存储库的主要内容,如果未能解决你的问题,请参考以下文章

尽管有登录凭据,Sonarqube 项目细节仍被披露

错误1064-尽管在线语法检查器说代码是正确的,但您的SQL语法在行中有错误……尽管如此

尽管有 .permitAll() 却触发了未经授权的请求

CSS:尽管旁边有浮动元素,如何使文本居中?

尽管有权限,但 mongod 权限被拒绝

为啥 NodeJS 中来自 Angular 的 GET 请求有时为空,尽管有数据