尽管有 @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 未实现/自动装配存储库的主要内容,如果未能解决你的问题,请参考以下文章