GORM 无法实现插件中的域类是 GORM 类

Posted

技术标签:

【中文标题】GORM 无法实现插件中的域类是 GORM 类【英文标题】:GORM fails to realize Domain classes from a plugin are GORM classes 【发布时间】:2016-06-24 07:54:47 【问题描述】:

我正在尝试将 Grails 项目用作插件,基本上将我的域类放在插件中,然后在多个 Grails 项目中使用它们。

我已经这样做了:

grails 创建应用程序网络

grails 创建应用插件

在两个项目的根目录中创建一个 settings.gradle 包括“插件”、“网络”

然后我在插件中添加了 spring security 并使用 s2-quickstart 创建了一个用户和一个角色域类,并在 Bootstrap.groovy 中添加了一些默认用户。

单独启动插件项目不会显示任何问题。

现在我将插件作为依赖项添加到 Web 项目中: 编译(':插件') 这样我就可以从 web 项目中的插件访问域类,它编译得很好。我将 spring 配置添加到 application.groovy,现在我正在尝试使用 web 项目中插件中的域类。

尝试这个但是我的项目没有正确启动,它告诉我这个:

java.lang.IllegalStateException: Either class [htcommon.HtRole] is not a domain class or GORM has not been initialized correctly or has already been shutdown. If you are unit testing your entities using the mocking APIs

只要我的代码尝试执行 new HtRole(...).save()

插件中的域类似乎无法以某种方式识别为 GORM 类。

【问题讨论】:

您应该使用create-plugin 而不是create-app。另外,是否使用正确的命名空间正确导入 HtRole? 你应该用grails create-plugin plugin而不是create-app来创建你的插件。在编写更多内容之前,您真的应该阅读有关如何创建插件的文档。你这里有很多问题。 我尝试了 grails create-app plugin --profile=plugin 以及 grails create-plugin 所有这些都产生了不同的错误。 :s 我应该阅读哪些文档?我从这里开始讨论多项目的内容:grails.github.io/grails-doc/latest/guide/… 它清楚地表明要通过 create-app @AlexanderKerchum 创建一个插件:HtRole 已正确导入,它编译得很好 另外,我认为compile (':web') 应该是compile (':plugin')。我必须查看您的更多代码才能为您提供更多信息。 是的,这是我在解释我所做的事情时犯的一个错误,我对插件项目有编译依赖项 【参考方案1】:

在 Grails 3.1.6 中使用 grails run-app 运行包含 GORM 域的插件时,我收到了相同的错误消息。我通过提供用于初始化 Hibernate 的显式配置来解决问题,如下所示:

build.gradle:

dependencies 
    ...
    runtime "org.grails.plugins:hibernate4"
    runtime "org.hibernate:hibernate-ehcache"

grails-app/conf/application.yml:

---
environments:
    development:
        hibernate:
            cache:
                queries: false
                use_second_level_cache: true
                use_query_cache: false
                region.factory_class: 'org.hibernate.cache.ehcache.EhCacheRegionFactory'

         dataSource:
             pooled: true
             jmxExport: true
             driverClassName: org.h2.Driver
             username: sa
             password:
             dbCreate: create-drop
             url: jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE

【讨论】:

愚蠢,愚蠢,愚蠢。当然,错误提示 GORM 实际上没有正确配置。当我看到插件中缺少数据源配置时,我应该想知道。这解决了我的 3.1.11 web-plugin 问题【参考方案2】:

域未被识别为 GORM 类的问题是由于其中提供的构造函数。这些构造函数是从s2-quickstart 生成的,但应该被删除(这是 spring-security-core 中的一个错误)。我删除了构造函数和你使用它们的一个地方,我使用了map style default constructors。然后我修复了您必须获取当前用户的呼叫。

The repaired source is in this repo on GitHub(patch-1 分支正在工作,master 是 OP 的原始损坏代码)

【讨论】:

以上是关于GORM 无法实现插件中的域类是 GORM 类的主要内容,如果未能解决你的问题,请参考以下文章

GORM 域类属性默认值

Grails,Field 的域类默认值

类权限不是域类或 GORM 未正确初始化或已关闭

使用GORM设置域类属性值

Grails GORM MongoDB。父模型类的问题

弹性搜索 hibernate 和 mongodb 域类 - Grails