2012-05-31 12 views
12

प्रश्न: अनुरोध के साथ स्वचालित आदेश ऑब्जेक्ट बाध्यकारी करने का कोई तरीका है। जेसन डेटा?Grails कमांड ऑब्जेक्ट: अनुरोध कैसे लोड करें। इसमें जसन?

class ProfileCommand{ 

int id 
String companyName 

static constraints = { 
    companyName blank: false 
    id nullable: false 
} 

@Override 
public String toString() { 
    return "ProfileCommand{id=$id, companyName='$companyName'}"; 
} 
} 

और की मेरी नियंत्रक विधि हस्ताक्षर:

def update(ProfileCommand command) {...}

मैं अपने आदेश वस्तु में request.JSON डेटा को कैसे प्राप्त कर सकते हैं

मेरी grails नियंत्रक में इस सरल कमान वस्तु को देखते हुए?

अब तक, एक ही रास्ता मैं इसे update() विधि के भीतर मैन्युअल रूप से आदेश वस्तु बनाने के लिए है करने के लिए सक्षम किया गया है, निर्माता तर्क के रूप में request.JSON में गुजर:

def command = new ProfileCommand(request.JSON) 

    log.debug "Command object contents: $command" 

ऊपर डिबग कमांड का उत्पादन:

Command object contents: ProfileCommand{id=1, companyName='Blub Muckers'} 

जो वही है जो मैं चाहता हूं (उपर्युक्त समाधान के लिए ओलिवर टायन्स के लिए एक बड़ा चिल्लाओ)। दुर्भाग्य से, command.validate() बुला के बाद मैं बनाने के आदेश के बाद अपवाद पैदा करता है:

Class org.codehaus.groovy.grails.web.taglib.exceptions.GrailsTagException 
Message Tag [validate] is missing required attribute [form] 

मैं v2.0.3 उपयोग कर रहा हूँ, यूआरआई एक ही अपवाद डब्ल्यू/v2.0.4 का उत्पादन किया।

अद्यतन प्रति इयान grails मेलिंग सूची पर रॉबर्ट्स, आप कमांड वर्ग के लिए @Validateable टिप्पणी जोड़ने के लिए validate() काम करने के लिए प्राप्त करने की आवश्यकता। धन्यवाद, इयान!

उत्तर

7

मुझे यकीन नहीं है कि स्वचालित JSON पैरामीटर डेटा बाध्यकारी करने के लिए कॉन्फ़िगरेशन-वार कुछ भी है; एक चीज जो आप करने में सक्षम हो सकती है वह है जो आपके कार्यों के लिए एक फ़िल्टर लिखना है जो जेएसओएन अनुरोध इनपुट लेता है जो मूल रूप से अनुरोध को रीमेप्स करता है। जेसन सीधे रूट पैराम मानचित्र पर है, जो सिद्धांत में स्वचालित डेटा बाध्यकारी होने की अनुमति देता है।

कुछ की तरह:

class JSONParamMapFilters { 
    def filters = { 
    before = { 
     remapFilter(controller:'yourController', action:'update') { 
      request.JSON.each { k,v -> 
       params[k] = v 
      } 
     } 
    } 
    } 
} 

फिर आप/regex के माध्यम से इस फिल्टर का विस्तार कर सकता है किसी भी लागू नियंत्रक कार्रवाई करने के नामकरण की परंपरा।

+0

यह काम करेगा। मैं इसे उत्तर के रूप में चिह्नित करूंगा जब तक कि किसी और के पास कोई अन्य सुझाव न हो। धन्यवाद, एक्वाटोड! –

+0

मदद करने के लिए खुशी हुई। मैं उस बिट को हटा दूंगा जो @Validateable एनोटेशन द्वारा तय किया गया है। – Aquatoad

+2

पैराम्स के साथ params.k = v को प्रतिस्थापित करें [k] = v - अन्यथा यह काम नहीं करेगा ... –

1

यदि आप कमांड ऑब्जेक्ट का उपयोग किसी भी नियंत्रक क्रियाओं के पैरामीटर के रूप में नहीं कर रहे हैं तो Grails स्वचालित रूप से एक वैध विधि के साथ इसे बढ़ाएगा नहीं। ग्रेल्स को बताने के लिए आपको कक्षा को @ वैलिटेबल के साथ एनोटेट करने की आवश्यकता है, इसे बढ़ाया जाना चाहिए।

http://grails.org/doc/latest/guide/validation.html#validationNonDomainAndCommandObjectClasses

4

आप UrlMappings.groovy में parseRequest=true उपयोग करना चाहिए। जैसे:

"/user/$id/$action?"(controller: "userProfile", parseRequest: true) { 
    constraints { 
     id matches: /^[0-9]+$/ 
    } 
} 

तो फिर तुम params चर या बाँध json एक कमांड वस्तु के लिए एक विधि बहस में उपयोग कर सकते हैं:

def index(MyCommand command){...}

दोनों काम करना चाहिए। लेकिन कुछ मामलों में यह जेसन (नक्शे पर बाध्यकारी) से कुछ जानकारी खो देता है।

+2

grails 2.3 पर पाठकों के लिए बस FYI, parseRequest अब कुछ भी नहीं करता है, आपको JSON मैन्युअल रूप से संभालने की आवश्यकता है। –

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