【问题标题】:Reading multiple entity scan packages in spring boot application在 Spring Boot 应用程序中读取多个实体扫描包
【发布时间】: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 表达式为您执行此操作。尽管您可能需要重新考虑这是否真的是您想要/需要的。

标签: spring spring-boot properties-file


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

  1. valuebasePackages 的别名:@EntityScan( {"scan.packages1","scan.packages2"})

  2. basePackagesvalue 的别名:@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
}

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

【讨论】:

    【解决方案4】:

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

    答案是

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

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

    【讨论】:

      【解决方案5】:

      试试这个:

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

      【讨论】:

      • 为什么?请在您的代码中添加一些解释,以便其他人可以从中学习
      猜你喜欢
      • 2020-12-03
      • 2018-11-06
      • 2020-11-13
      • 2021-03-21
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 2022-12-14
      • 2019-12-18
      相关资源
      最近更新 更多