2016-10-13 8 views
5

मैं एक एनोटेशन और एक पहलू का उपयोग करके एक अंगूर नियंत्रक विधि के तर्कों को पुनर्प्राप्त करने का प्रयास कर रहा हूं जो विधि से पहले निष्पादित करता है। पहलू हैंडलर सही ढंग से निष्पादित करता है लेकिन मैं तर्क का उपयोग नहीं कर सकता (जो grails.validation.Validateable लागू करता है) तर्कों की सूची खाली है।Grails 3.0.11 प्रीप्रोसेस कमांड के लिए एओपी एनोटेशन कंट्रोलर विधियों से पहले ऑब्जेक्ट्स

experiment.aspect.validated

package experiment.aspect 

import java.lang.annotation.ElementType 
import java.lang.annotation.Retention 
import java.lang.annotation.RetentionPolicy 
import java.lang.annotation.Target 

/** 
* Created by Vaggelis on 10/13/2016. 
*/ 

@Target(ElementType.METHOD) 
@Retention(RetentionPolicy.RUNTIME) 
@interface Validated { 

} 

experiment.aspect.ValidatedAspect

package experiment.aspect 


import grails.validation.ValidationException 
import org.aspectj.lang.JoinPoint 

import org.aspectj.lang.annotation.Aspect 
import org.aspectj.lang.annotation.Before 


/** 
* Created by Vaggelis on 10/13/2016. 
*/ 
@Aspect 
class ValidatedAspect { 

    @Before("@annotation(experiment.aspect.Validated)") 
    public void preValidate(JoinPoint point) throws ValidationException{ 

     println "parameters ${point.getArgs()}" 


    } 
} 

conf.spring.resources

import experiment.aspect.ValidatedAspect 

// Place your Spring DSL code here 
beans = { 
    validatedAspect(ValidatedAspect) 
} 

controllers.experiment.TestController

package experiment 
import experiment.aspect.Validated 
class TestController extends BaseController { 
    static responseFormats = ['json'] 
    @Validated 
    def login(LoginCommand loginCommand){ 
     println "Validated" 
     ... 
    } 

} 

experiment.LoginCommand

package experiment 

/** 
* Created by Vaggelis on 9/14/2016. 
*/ 
import grails.validation.Validateable 


class LoginCommand implements Validateable { 
// String id 
    String name 
    static constraints = { 
     name blank: false 
    } 
} 

मैं निम्नलिखित उत्पादन, जिसका अर्थ है कि पहलू हैंडलर विधि नियंत्रक विधि से पहले चलाता है, लेकिन यह नहीं मिलता है तर्क

parameters [] 
Validated 

उत्तर

2

आप कोई तर्क नहीं देख रहे हैं क्योंकि कोई भी नहीं है।

डाटाबेसिंग का समर्थन करने के लिए और चीजों को सरल रखने के लिए जब सर्वलेट तय करता है कि कौन सा नियंत्रक और कॉल करने का तरीका है, तो एएसटी ट्रांसफॉर्म एक ही नाम के साथ एक नई विधि बनाता है और सभी एक्शन विधियों के लिए कोई तर्क नहीं है जिसमें कोई तर्क है। शून्य-तर्क विधि प्रारंभिक रूप से सर्वलेट द्वारा बुलाया जाता है, और इसमें डेटा बाइंडिंग कॉल करने के लिए ट्रांसफॉर्म द्वारा तर्क जोड़ा जाता है। ऐसा करने के बाद यह आपके पैरामीटर विधि को अंतर/लम्बा/बूलियन/कमांड ऑब्जेक्ट्स/आदि में परिवर्तित पैरा स्ट्रिंग्स के साथ कॉल करता है।

नो-एर्ग विधि @grails.web.Action और commandObjects विशेषता में निर्दिष्ट तर्क प्रकारों के साथ भी एनोटेट किया जाएगा। यह अन्य विधि को खोजने में मदद करेगा, लेकिन यह वास्तव में सरल है क्योंकि अगर आप ओवरलोडेड सार्वजनिक विधियों की घोषणा करते हैं तो आपको एक कंपाइलर त्रुटि मिल जाएगी।

यह सब करने के बाद, शायद आप इस दृष्टिकोण का उपयोग नहीं करना चाहते हैं, भले ही यह काम करता हो - नियंत्रक कार्रवाई कॉल को रोकने के लिए पहले से ही दो मौजूदा मानक तरीके हैं, Grails फ़िल्टर (अब 3.x में इंटरसेप्टर) और सर्वलेट फ़िल्टर । Grails फ़िल्टर और इंटरसेप्टर अनुरोध पैरामीटर को वैकल्पिक रूप से जोड़ने, संशोधित करने या हटाने के लिए तुच्छ बनाते हैं, और यदि आप 'पहले' कॉल से झूठी वापसी करते हैं तो आप अनुरोध को संभालने से Grails को रोक देंगे (उदाहरण के लिए क्योंकि आपने इसे स्वयं प्रस्तुत किया है, या रीडायरेक्ट भेजा है , आदि)

+0

क्या इसका मतलब यह नहीं होगा कि दोनों विधियों को एनोटेट किया जाएगा? मैं इंटरसेप्टर के बारे में जानता हूं, वे शांत हैं लेकिन मैं इसके लिए उपयोग नहीं करना चाहता हूं। – Evan

+1

नहीं, इसका उपयोग कॉल करने योग्य कार्यों को चिह्नित करने के लिए किया जाता है - टाइप की गई विधियां प्रभावी रूप से गैर-सार्वजनिक –

+0

ग्रेट :( लेकिन इसका मतलब है कि अगर मैं एराउंड एनोटेशन का उपयोग करके कार्रवाई की अवधि लॉग करना चाहता था, तो मैं केवल समय की गणना करता नो-एर्ग विधि के निष्पादन के लिए। – Evan

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