【问题标题】:How to import domain classes from jar into a Micronaut project?如何将域类从 jar 导入 Micronaut 项目?
【发布时间】:2019-05-06 09:37:15
【问题描述】:

我有一个配置为使用 GORM 和 Groovy (1) 的 Micronaut 项目。该项目包含许多运行良好的领域类,按预期将数据持久保存在 MySQL 数据库中。

现在我想让这个领域类在另一个 Micronaut 项目中通用 (2)。

我尝试构建一个仅包含域包的 JAR 文件,并将其通过build.gradle 包含在项目 (2) 中。这些类被编译并可以在代码中访问,我可以调用像findBycreateCriteria 等 GORM 方法。还值得一提的是,项目 2 的所有域类都用 @Entity 注释。

但是,当我运行项目(使用 IntelliJ 想法)并点击其中一些代码时,我得到:

Either class [com.project2.domain.Foo] is not a 
domain class or GORM has not been initialized correctly or has already 
been shutdown. Ensure GORM is loaded and configured correctly before 
calling any methods on a GORM entity.

我知道 GORM 配置和初始化都很好,因为我在项目 2 中创建了一个“本地”域类并且一切正常。

在问这个问题之前我看到了这个,也许它可以带来一些启发:Importing domain classes from GORM-standalone module into Grails

编辑 1:当前 build.gradle 依赖项:

dependencies {
    compile "io.micronaut.configuration:micronaut-kafka"
    compile "io.micronaut.configuration:micronaut-hibernate-validator"

    compile("io.micronaut.configuration:micronaut-hibernate-gorm") {
        exclude group: 'org.grails', module: 'grails-datastore-gorm-hibernate5'
    }
    compile "org.grails:grails-datastore-gorm-hibernate5:6.1.9.RELEASE"

    compile "io.micronaut:micronaut-http-client"
    compile "io.micronaut:micronaut-http-server-netty"
    compile "io.micronaut:micronaut-runtime-groovy"
    compile "io.micronaut:micronaut-validation"
    compileOnly "io.micronaut:micronaut-inject-groovy"
    runtime "ch.qos.logback:logback-classic:1.2.3"

    runtime "org.apache.tomcat:tomcat-jdbc"

    runtime "mysql:mysql-connector-java:6.0.6"

    testCompile "io.micronaut:micronaut-inject-groovy"

    testCompile("org.spockframework:spock-core") {
        exclude group: "org.codehaus.groovy", module: "groovy-all"
    }

    compile files('src/main/resources/libs/my-domain-lib.jar')
}

提前致谢!

【问题讨论】:

    标签: java hibernate grails grails-orm micronaut


    【解决方案1】:

    我正在使用类似的设置。

    我有一个带有 GORM-standalone 的 core-lib,以及几个 (Vert.x) verticles 和 Grails 应用程序,它们通过 gradle 的 compile project()compile dep:from-artifactory:0.1-SNAPSHOT 指令使用这些应用程序。

    为了使它成为可能,我需要:

    1) 确保每个域类都用grails.gorm.annotation.Entity注解

    2) 像这样调整 Grails 的 Application.groovy

    class Application extends GrailsAutoConfiguration {
    
      @Override
      protected boolean limitScanningToApplication() {
        false
      }
    
      @Override
      Collection<String> packageNames() {
        super.packageNames() + 'your.domainclass.package'
      }
    
    }
    

    3) 对于非 Grails 项目,我需要自己查找和初始化域类,并且对于每个 DB,它可以是不同的(我的是 Mongo-GORM

    ClassPathScanningCandidateComponentProvider compProvider = new ClassPathScanningCandidateComponentProvider( false )
    compProvider.addIncludeFilter new AnnotationTypeFilter( Entity )
    def domainClasses = compProvider.findCandidateComponents( 'io.my.domain' ).collect{ BeanDefinition bd -> Class.forName bd.beanClassName }
    new MongoDatastore( config, *domainClasses )
    

    【讨论】:

    • 3 号正是我想要的。你究竟是如何做到这一点的?我也经常使用 Grails,但 Micronaut 的工作方式不同,我找不到扫描 Application.groovy 包之外的类的方法。
    • 就是这样。刚刚将 MongoDatastore 更改为 HibernateDatastore (当然还有包名),它就像一个魅力。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 2015-05-28
    • 2016-02-08
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    相关资源
    最近更新 更多