2011-04-10 13 views
7

आम तौर पर एक Grails डोमेन या कमांड कक्षा के लिए, आप अपनी बाधाओं की घोषणा करते हैं और ढांचे validate() विधि जोड़ता है जो जांचता है कि इनमें से प्रत्येक बाधा वर्तमान उदाहरण के लिए मान्य है या नहीं।कस्टम Grails सत्यापन

class Adult { 

    String name 
    Integer age 

    void preValidate() { 
    // Implementation omitted 
    } 

    static constraints = { 
    name(blank: false) 
    age(min: 18) 
    } 
} 

def p = new Person(name: 'bob', age: 21) 
p.validate() 

मेरे मामले में मुझे यकीन है कि preValidate हमेशा से पहले वर्ग मान्य है निष्पादित किया जाता है बनाना चाहते हैं। मैं customValidate बजाय validate कॉल करने के लिए एक विधि

def customValidate() { 
    preValidate() 
    validate() 
} 

लेकिन फिर जो कोई इस वर्ग का उपयोग करता है याद करने की जरूरत है जोड़कर इस लक्ष्य को हासिल कर सकते हैं। मैं ऐसा नहीं कर सकते या तो

def validate() { 
    preValidate() 
    super.validate() 
} 

क्योंकि validate माता पिता वर्ग की एक विधि (यह metaprogramming से जोड़ दिया जाता है) नहीं है। क्या मेरा लक्ष्य हासिल करने का कोई और तरीका है?

उत्तर

2

आपको मेटाक्लास पर मान्य होने के अपने संस्करण का उपयोग करके इसे पूरा करने में सक्षम होना चाहिए, जब आपके डोमेन/कमांड क्लास में प्रीवालिडेट() विधि हो। अपने BootStrap.groovy में नीचे दिए गए कोड को कुछ इसी तरह आप के लिए काम कर सकता था:

class BootStrap { 

    def grailsApplication // Set via dependency injection 

    def init = { servletContext -> 

     for (artefactClass in grailsApplication.allArtefacts) { 
      def origValidate = artefactClass.metaClass.getMetaMethod('validate', [] as Class[]) 
      if (!origValidate) { 
       continue 
      } 

      def preValidateMethod = artefactClass.metaClass.getMetaMethod('preValidate', [] as Class[]) 
      if (!preValidateMethod) { 
       continue 
      } 

      artefactClass.metaClass.validate = { 
       preValidateMethod.invoke(delegate) 
       origValidate.invoke(delegate) 
      } 
     } 
    } 

    def destroy = { 
    } 
} 
2

आप beforeValidate() घटना का उपयोग कर अपने लक्ष्य को पूरा करने में सक्षम हो सकता है। यह 1.3.6 Release Notes में वर्णित है।

संबंधित मुद्दे