在 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 参数