如何使用Spring Boot从不同的包中自动装配存储库接口?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Spring Boot从不同的包中自动装配存储库接口?相关的知识,希望对你有一定的参考价值。

我是Spring Boot的新手,想要从Rest Controller中的不同包中自动装配存储库。似乎当我将接口和实现放在不同的包中时,实际控制器的自动装置似乎失败了。

引起:org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到[com.acme.repository.RawDataRepository]类型的限定bean用于依赖:

控制器:

package com.acme.controller;
import com.acme.repository.RawDataRepository;
// imports removed!

@RestController
@EnableAutoConfiguration
@ComponentScan("com.acme")
public class DataCollectionController {

    @Autowired
    private RawDataRepository repository;

    // code removed!
}

我试图使用@ComponentScan注释,但这没有给出解决方案。知道我错过了什么吗?每当我将接口放入控制器所在的包中时,一切顺利。

答案

如果你有一个不同的包中的Spring Data @Repositories你必须明确@EnableJpaRepositories(或用你自己的味道取代“Jpa”)。 Boot从包含@EnableAutoConfiguration的包中获取默认值,因此它也可以移动该类。

另一答案

Spring Boot提供启用存储库的注释。因此,只要有人使用任何存储库(它可以是JPARepository,CassandraReposotory),就应该在Application Class本身中启用它。

例:

@EnableCassandraRepositories("package name")
@EnableJpaRepositories("package name")

在提供上述注释之后,容器也负责为存储库注入bean。

另一答案

您必须使用以下两个注释

@EnableJpaRepositories(basePackages = "package-name")
@EntityScan(basePackages = "package-name")

如果主类位于某个不同的包中,EnableJpaRepositories将启用存储库。您还需要使用EntityScan指向包含实体bean的包,否则它将因“Bean不是托管类型”错误而失败。

以上是关于如何使用Spring Boot从不同的包中自动装配存储库接口?的主要内容,如果未能解决你的问题,请参考以下文章

Spring-boot,无法自动装配类。未找到默认构造函数引发异常

spring boot 自动装配的实现原理和骚操作,不同版本实现细节调整,debug 到裂开......

Spring Boot 自动装配定义与自定义starter原理,及如何实现自定义装配

Spring Boot 自动装配定义与自定义starter原理,及如何实现自定义装配

深度剖析Spring Boot自动装配机制实现原理

Spring boot 自动装配