2011-01-21 9 views
14

मैं अभी Grails के साथ शुरू कर रहा हूँ, और यहां पहला मुद्दा है।Grails डोमेन ऑब्जेक्ट सेविंग पर त्रुटि के बारे में मुझे क्यों सूचित नहीं करता है?

मैंने यह पता लगाने के लिए कई घंटे बिताए कि डोमेन ऑब्जेक्ट डीबी में डाला नहीं जा सकता है, जब तक कि इसकी सभी संपत्तियां आबादी न हों।

class Item { 
    String title 
    String link 
} 

class ItemController { 
    def fetch = { 
    def item = new Item() 
    item.title = "blabla" 
    // no value for "link" 
    item.save() 
    } 
} 

तार्किक लग रहा है, लेकिन यह इतनी चुपचाप क्यों छोड़ा गया है? क्या मैं ऐसे मामलों में अपवाद प्राप्त करने के लिए कुछ कॉन्फ़िगर कर सकता हूं?

धन्यवाद

उत्तर

29

डिफ़ॉल्ट रूप से कोई अपवाद नहीं फेंक दिया जाता है।

डोमेन कक्षाओं में इंजेक्शन save() विधि सत्यापन चरण के दौरान कोई त्रुटि हुई है, तो false देता है। एक डोमेन वर्ग के/अद्यतन को बचाने की जाँच के लिए एक क्लासिक कोड नमूना है:

if (!myDomainObj.save()) { 
    log.warn myDomainObj.errors.allErrors.join(' \n') //each error is an instance of org.springframework.validation.FieldError  
} 

आप किसी विशेष डोमेन वर्ग के लिए एक अपवाद है की जरूरत है, उपयोग करें:

myDomainObj.save(failOnError: true) 

और सत्यापन विफलताओं के लिए अपवाद फेंक दिया जाएगा।

आप हर डोमेन कक्षाओं के लिए एक अपवाद फेंक करना चाहते हैं, तो बस grails.gorm.failOnErrortrue को grails एप्लिकेशन के अंतर्गत/conf में सेट/Config.groovy

सावधान रहें: सभी डोमेन गुण एक अंतर्निहित nullable: false बाधा है।

मैं आपको this article पढ़ने की सलाह देता हूं।

+0

'grails.gorm.failOnError = true' के लिए धन्यवाद। IMHO यह डिफ़ॉल्ट होना चाहिए। किसी भी मामले में यह इस के लिए एक आदर्श पूरक है जिसे मैं उपयोग करना चाहता हूं: 'grails.gorm.default.constraints = {' * 'nullable: true}' बाधाओं को ब्लॉक ** ** ** ** बाधाओं को जोड़ने के लिए उपयोग किया जाना चाहिए, जैसे कि कुछ फ़ील्ड की आवश्यकता होती है, उन्हें उठाना नहीं। – Tobia

+0

आदर्श रूप से, आईएमएचओ, Grails को डिफ़ॉल्ट रूप से आवश्यक 'संबंधित' फ़ील्ड बनाना चाहिए, और अन्य सभी वैकल्पिक। – Tobia

2

अपने save() कॉल एक RuntimeException फेंक बनाने के लिए, आप item.save(failOnError:true) उपयोग कर सकते हैं। लेकिन आप सेव() विधि के वापसी मूल्य भी देख सकते हैं। यदि यह गलत है, तो इसका मतलब है कि कुछ गलत हुआ।

if (item.save()) { 
    //succeeded 
} 
else { 
    //not succeeded 
} 
+0

आह, यह आईडी लौटाता है। मैंने सोचा कि शून्य का मतलब यहां कुछ भी नहीं है। धन्यवाद! – mkuzmin

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