【发布时间】:2013-10-28 20:27:08
【问题描述】:
在 Grails 中,您可以像这样在项目的 Config.groovy 文件中定义全局约束
grails.gorm.default.constraints = {
myShared(nullable: false, blank: false)
}
并在域内像这样使用它们
static constraints = {
name(shared: "myShared")
}
由于我们的领域类在多个 Grails 项目中被重用,它们被拆分为插件。插件的 Config.groovy 文件被排除在外,因此在那里定义全局约束将不起作用。因此,我创建了一个 Constraints.groovy 文件,该文件被合并到包含域类的插件的插件描述符内的应用程序配置中。这可行,但我仍然在运行主项目(grails run-app)时遇到以下异常:
Caused by GrailsConfigurationException: Property [test.plugin.TestDomain.name] references shared constraint [myShared:null], which doesn't exist!
在 Grails 核心中进行一些调试后,我发现在运行插件描述符之前,域类已经使用共享约束进行了初始化。
public DefaultGrailsDomainClass(Class<?> clazz, Map<String, Object> defaultConstraints)
构造函数中的映射包含共享约束。如果我将全局约束放在主项目的 Config.groovy 文件中,它包含定义的约束并且一切正常。但是,如果我将它们合并到插件描述符中,则此映射为空并引发异常。
我的问题是是否可以在 Grails 插件中以某种方式定义全局约束?我可能错过了什么? 将全局约束复制到每个 Grails 项目中不应成为解决方案。此外,首选不使用其他插件来定义约束的解决方案。
顺便说一句,我们使用的是 Grails 2.2.4。
【问题讨论】:
-
Config.groovy 被排除在外,但您可以创建另一个以 Config 结尾的文件,例如MyPluginConfig.groovy。你能检查一下共享约束是否有效吗?无需在您的应用程序中手动合并它们。
-
感谢您的回复。我按照您的建议尝试了,但这也不起作用。您确定通过像您建议的那样命名它们来包含配置吗?我以为这只适用于 UrlMappings?
-
是的,你是对的。 Grails Platform Core plugin add's a doWithConfig closure,您可以使用它。
-
使用 doWithConfig-Closure 合并配置工作正常,感谢您指向插件。尽管如此,全局约束的问题仍然存在,因为 doWithConfig 在域类使用约束初始化后也会被调用。