[英]Groovy / Grails: Enhance a Static Closure
我正在尋找一種修改/更改現有閉包的方法。 但是,我不想覆蓋它。 相反,我想增強它。
這是一個簡單的例子。 假設我們有一個Address對象:
class Address {
String street
String city
String state
String zipCode
static constraints = {
street( nullable:true )
city( blank:false )
state( size:2..2 )
}
}
這將是一個很好的例子,因為它也是有效的Grails域對象。 我想要做的是在運行時/動態地向Address類添加另一個約束:
class Address {
String street
String city
String state
String zipCode
static constraints = {
street( nullable: true )
city( blank: false )
state( size: 2..2 )
zipCode( size: 5..6 )
}
}
注意新的zipCode
約束嗎? 我知道可以通過metaClass
重寫約束,從而一起改變所有約束。 但是,這里的目標不是在過程中傷害任何人,因此我只想添加到現有的閉包中。
您確實可以在運行時更改約束。
ConstrainedProperty constrainedProperty = Address.constraints.zipCode
constrainedProperty.setSize(5..6)
我想您可能在這里不走運。 據我所知,Grails開發人員不希望您在運行時修改約束。 約束存儲在
org.codehaus.groovy.grails.commons.DefaultGrailsDomainClass
約束本身存儲為私有映射,只有訪問者
public Map getConstrainedProperties()
{
return Collections.unmodifiableMap(this.constraints);
}
約束關閉由org.codehaus.groovy.grails.validation.ConstrainedPropertyBuilder處理。
顯然,您可以編寫自己的DomainClass類,該類具有可修改的約束對象,然后將其注入基於Spring的初始化中,但是我懷疑這是您可能不希望采用的路徑。
另外的想法-我不知道zipCode約束的具體示例,但是許多約束都強制執行數據庫列約束,因此在運行時添加這些約束可能會導致奇怪的行為。 我認為使用自定義約束驗證器將更容易避免怪異的數據庫錯誤。
更新
再看一下,我發現DefaultGrailsDomainClass具有refreshConstraints()方法,該方法似乎迫使重新評估約束閉包,盡管我仍然不確定是否可以修改閉包本身,或者為什么此功能首先存在。
在1.2 Grails中添加了共享約束-我想知道是否可以創建一個zipCode共享約束,以某種方式對其進行修改,然后調用refresh。
認為我可能不太理解,因為您也可以將其視為域級別驗證...可以嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.