2014-04-11 49 views
2

爲了支持UTFMB8 encoding我添加了以下默認約束在Config.groovy添加約束插件域類

grails.gorm.default.constraints = { 
    '*'(maxSize: 191) 

    unlimitedSize(maxSize: Integer.MAX_VALUE) 
} 

我還添加了unlimitedSize共享的約束,我在我的一些領域類的使用覆蓋此默認情況下,例如

class BlogPost { 
    String body 

    static constraints = { 
     body shared: 'unlimitedSize' 
    } 
} 

然而,也有插件幾類,也需要覆蓋默認的191 maxSize在這種情況下,我不能使用共享的約束,因爲我不能編輯源代碼。一種選擇是將類複製到我的應用程序中,並編輯這些副本(因爲應用程序中的工件會覆蓋插件中的工件),但這不是很吸引人,因爲我已經有效地分叉了這些類。

有沒有更好的方法?例如,是否可以在Bootstrap.groovy中爲這些域類添加約束條件?

class BootStrap { 
    def grailsApplication 

    def init = { servletContext -> 
     grailsApplication.domainClasses.each { GrailsDomainClass gdc -> 
      Class domainClass = gdc.clazz 
      if (domainClass.simpleName == 'BookFromPlugin') { 

       def field = domainClass.declaredFields.find { 
        it.name == 'body' && it.type == String 
       } 

       if (field) { 
        domainClass.constraints.body.maxSize = Integer.MAX_VALUE 
       } 
      } 
     } 
    } 
} 

其中BookFromPlugin是插件和body域類是從域類的屬性:

回答

3

約束可以自舉像過程中添加。這可以進行優化,並適用於多個領域類。

由於bootstrap是最後一個被照顧的事情,它最終應該覆蓋之前在domain類中定義的約束。

UPDATE:
我猜你的意思domainClass.constraints正在訪問從域類的私有變量,但事實並非如此。 domain.constraints給出了一個映射,其中propery名稱映射到它的所有約束。這張地圖取自ConstrainedProperty,它由3個元素組成:擁有約束的類,將應用約束的屬性名稱以及屬性的類型。

所以當我們使用domain.constraints.body它實際上給出了一個約束列表body作爲關鍵body的值。列表中的每個元素是ConstrainedProperty

致電setMaxSize()我們只是將另一個ConstrainedProperty添加到約束列表。

+1

有一些小的變化,它的工作原理,謝謝!但是,我認爲'domainClass.constraints'正在訪問一個私人變量,這有點頑皮。我想知道是否有可能在不訪問私人領域的情況下獲得相同的結果? –

+0

感謝編輯和對不起,我沒有測試它在星期五晚上回家之前。 :)看看我的更新回答。對於評論太長了。 – dmahapatro

+0

另請注意,我從示例中檢查了字符串的類型,以確保「maxSize」約束僅應用於String屬性。是在使用時產生噪音嗎? @唐 – dmahapatro