在 Spring Boot 应用程序中读取多个实体扫描包

Posted

技术标签:

【中文标题】在 Spring Boot 应用程序中读取多个实体扫描包【英文标题】:Reading multiple entity scan packages in spring boot application 【发布时间】:2019-08-17 20:15:50 【问题描述】:

我有 Spring Boot 应用程序

@SpringBootApplication
@EntityScan(basePackages = "$scan.packages")
public class MyApplication 

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

同时从一个用逗号分隔的属性读取多个实体扫描包时,如下所示?

scan.packages=com.mycompany.model.package1 , com.mycompany.model.package2

我遇到了这个异常:

java.lang.IllegalArgumentException:未知实体: com.mycompany.model.package2.Myclass

【问题讨论】:

从实体扫描中删除,然后Spring可能会尝试将它们解析为数组。如果这不起作用,您可能需要使用 SpEL 表达式为您执行此操作。尽管您可能需要重新考虑这是否真的是您想要/需要的。 【参考方案1】:

您可以像这样扫描多个实体

@EntityScan(basePackages= "scan.packages1","scan.packages2")

【讨论】:

感谢您的回复,但我需要将它们作为一个用逗号分隔的属性来阅读 用逗号分隔的属性是什么意思 你想从任何属性文件中导入扫描包? 不,我有一个属性,比如 property=package1, package2 我只需要读取这个属性来扫描这两个包【参考方案2】:

这应该可以工作

@EntityScan(basePackages = "#'$scan.packages'.split(',')")

【讨论】:

非常感谢@Bunyamin,不幸的是它不起作用 @Elsayed the original response 了解更多信息。即使我无法让它工作:(【参考方案3】:

根据EntityScan annotation javadoc,有三种方法可以定义要扫描实体的包:

    value,basePackages 的别名:@EntityScan( "scan.packages1","scan.packages2")

    basePackages,value 的别名:@EntityScan(basePackages= "scan.packages1","scan.packages2")

    basePackagesClasses,类型安全版本:@EntityScan(basePackages=E.class。其中 E 是一个标记界面,只是为了给实体加下划线。请看下面的代码。也可以是注解。

    interface E 
    
    
    @Entity
    public class Glass implements E 
    // Typical code to be added here
    
    

或者作为注解:

@Retention(RetentionPolicy.RUNTIME) 
@interface E 


@Entity
@E
public class Glass implements E 
   // Typical code to be added here

从我的角度来看,我会选择直接使用value 或basePackageClasses。如果我能读到一些更容易阅读的东西,我会这样做,我认为这就是 value 所做的,而 basePackageClasses 引入了类型安全的额外好处,我可以看到这样做的多个原因。这一切都取决于上下文。

【讨论】:

【参考方案4】:

我遇到了同样的问题,并在 Spring Boot 问题跟踪器上发布了一个 issue。

答案是

...如#25436 所示,@EntityScan 在 2.3 中确实支持属性解决方案,因此,如果我们决定恢复支持,我们可能要考虑如何处理多值属性。

因此,似乎某些 Spring Boot 版本确实支持它,但随后又放弃了支持...有关更多信息,请查看引用中链接的 Spring Boot 问题。

【讨论】:

【参考方案5】:

试试这个:

@EntityScan(basePackages= "$scan.packages1","scan.packages2")

【讨论】:

为什么?请在您的代码中添加一些解释,以便其他人可以从中学习

以上是关于在 Spring Boot 应用程序中读取多个实体扫描包的主要内容,如果未能解决你的问题,请参考以下文章

在 Spring boot 中使用 post 方法保存多个实体时的无限循环

在 Spring Boot jpa 中将多个外键映射到同一个主键

如何在自定义反序列化器 Spring Boot 中读取路径变量或 URL 参数

Spring Boot JPA:将一个实体映射到具有相同列的多个(很多)表

使用spring-boot在多个数据库之间进行数据迁移

spring boot中@ConfigurationProperties的使用