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



>我有 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,有三种方法可以定义扫描实体的包:

  1. 值,基本包的别名:@EntityScan( {"scan.packages1","scan.packages2"})

  2. basePackages,值的别名:@EntityScan(basePackages= {"scan.packages1","scan.packages2"})

  3. 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}"})

最新更新