>我有 Spring 启动应用程序
@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
您可以像这样扫描多个实体
@EntityScan(basePackages = {"scan.packages1","scan.packages2"})
这应该有效
@EntityScan(basePackages = {"#{'${scan.packages}'.split(',')}"})
根据 EntityScan 注释 javadoc,有三种方法可以定义扫描实体的包:
-
值,基本包的别名:
@EntityScan( {"scan.packages1","scan.packages2"})
-
basePackages,值的别名:
@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。如果我能更容易阅读,我会这样做,我认为这就是值的作用,而basePackageClasses引入了类型安全的额外好处,我可以看到这样做的多种原因。这完全取决于上下文。
我遇到了同样的问题,并在Spring Boot问题跟踪器上发布了一个关于它的问题。
答案是
。如 #25436 所示,
@EntityScan
确实在 2.3 中支持属性解决方案,因此,如果我们决定恢复支持,我们可能需要考虑如何处理多值属性。
所以看起来一些 Spring 启动版本确实支持它,但随后支持再次被放弃......有关更多信息,请查看报价中链接的 Spring 启动问题。
试试这个:
@EntityScan(basePackages= {"${scan.packages1","scan.packages2}"})