Grails中,你可以在項目的Config.groovy中定義全局約束文件中像這樣在一個Grails插件定義全局約束
grails.gorm.default.constraints = {
myShared(nullable: false, blank: false)
}
,並使用它們像這樣的域名
static constraints = {
name(shared: "myShared")
}
內由於我們的域類在幾個Grails項目中被重用,它們被分成插件。插件的Config.groovy文件被排除在外,因此定義全局約束將不起作用。因此,我創建了一個Constraints.groovy文件,該文件被合併到包含域類的插件的插件描述符中的應用程序配置中。這工作,但我仍然得到以下異常運行主項目(Grails的運行的應用程序):
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? – cawka
是的,你是對的。 [Grails平臺核心插件添加一個doWithConfig結束](http://grailsrocks.github.io/grails-platform-core/ref/Plugin%20Conventions/doWithConfig.html),你可以使用它。 –