使用 Spring Data Rest 时如何从组件扫描中排除 @Repository

Posted

技术标签:

【中文标题】使用 Spring Data Rest 时如何从组件扫描中排除 @Repository【英文标题】:How to exclude a @Repository from component scan when using Spring Data Rest 【发布时间】:2017-04-24 02:59:21 【问题描述】:

在 Spring Boot 项目中,我无法从组件扫描中排除一些存储库。

我有一个包含一些实体和一些存储库 (JpaRepositories) 的库。出于某种原因,我实现了一个小型 Spring Boot Data Rest 应用程序,该应用程序用于让测试人员快速访问实体。因此,我实现了一个扩展 PagingAndSortingRepository 并使用 @RepositoryRestResource 进行注释的存储库。

当应用程序启动时,所有存储库都将被扫描并可用。只要我只想让 Data Rest 存储库可用,我就对组件扫描器进行了注释以排除不需要的存储库。但这不起作用。我检查了执行器 bean 端点和我所做的任何事情 - 没有排除任何存储库。

为了演示这个问题,我创建了一个简单的演示应用程序:https://github.com/magomi/springboot-restdata-repoloading。

为了排除 DataRepository,我尝试了两种方法:

// exclude V02
@SpringBootApplication
@ComponentScan(excludeFilters = 
        @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = 
                DataRepository.class)
)

// exclude V01
@SpringBootApplication(exclude =  DataRepository.class )

没有成功。当我调用 /beans 端点(由 spring boot 执行器提供)时,我总是看到


    bean: "dataRepository",
    aliases: [ ],
    scope: "singleton",
    type: "org.codefromhell.test.repoloading.DataRepository",
    ...
,

    bean: "dataApiRepository",
    aliases: [ ],
    scope: "singleton",
    type: "org.codefromhell.test.repoloading.api.DataApiRepository",
    ...
,

【问题讨论】:

【参考方案1】:

因为它是一个存储库而不是严格意义上的 @Component,所以您需要通过将 @EnableJpaRepositories 添加到您的应用程序来排除它:

@SpringBootApplication
@EnableJpaRepositories(excludeFilters = 
        @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = 
                DataRepository.class)
)
public class ApiApplication 

    public static void main(String[] args) 
        SpringApplication.run(ApiApplication.class, args);
    

【讨论】:

【参考方案2】:

您可以在存储库接口上使用org.springframework.data.repository.NoRepositoryBean 注释。 来自文档:

注释以排除存储库接口被拾取并因此创建实例。

这通常用于为所有存储库提供扩展基接口并结合自定义存储库基类来实现在该中间接口中声明的方法。在这种情况下,您通常会从中间接口派生具体的存储库接口,但不想为中间接口创建 Spring bean。

【讨论】:

简单、精美、智能的解决方案。

以上是关于使用 Spring Data Rest 时如何从组件扫描中排除 @Repository的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data Rest:如何使用请求正文发送多部分文件

使用 Spring Data REST 进行密码编码

如何在 Spring-Data-Rest 中实现细粒度的访问控制?

在Spring Boot Data JPA Rest API中使用PostgreSql时,表未找到错误

如何禁用 Spring Data REST 存储库的默认公开?

如何使用 Spring Data REST 进行高级搜索?