簡體   English   中英

Groovy / Grails:增強靜態封閉

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM