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 类的主要内容,如果未能解决你的问题,请参考以下文章