2010-07-12 14 views
18

यह आसान होना चाहिए:वसंत एमवीसी 3.0 के साथ हैंडलर इंटरसेप्टर पंजीकृत कैसे करें?

<bean id="handlerMapping" 
    class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
    <property name="interceptors"> 
     <list> 
      <ref bean="myInterceptor" /> 
     </list> 
    </property> 
</bean> 

लेकिन इस तरह से इंटरसेप्टर नहीं बुलाया जाता है।

+2

आप भी है '

के बाद मेरी इंटरसेप्टर है वहाँ कहीं में'? – skaffman

+0

हां, javax.validation हैंडलिंग को सक्रिय करने के लिए (और शायद अन्य चीजों का ढेर) – Bozho

उत्तर

29

डिफ़ॉल्ट रूप से, वसंत BeanNameUrlHandlerMapping, और DefaultAnnotationHandlerMapping पंजीकृत करेगा, बिना किसी स्पष्ट कॉन्फ़िगरेशन के।

यदि आप अपना खुद का HandlerMapping बीन्स परिभाषित करते हैं, तो डिफ़ॉल्ट वाले पंजीकृत नहीं होंगे, और आपको स्पष्ट रूप से घोषित किए गए लोग मिलेंगे।

अभी तक, बहुत अच्छा है।

समस्या तब होती है जब आप मिश्रण में <mvc:annotation-driven/> जोड़ते हैं। यह भी अपने स्वयं के DefaultAnnotationHandlerMapping घोषित करता है, जो डिफ़ॉल्ट को प्रतिस्थापित करता है। हालांकि, अगर आप अपना खुद का घोषित करते हैं, तो आप दो के साथ समाप्त होते हैं। चूंकि घोषणा के क्रम में उनका परामर्श लिया जाता है, इसलिए आमतौर पर इसका मतलब है कि <mvc:annotation-driven/> द्वारा पंजीकृत एक को पहले कॉल किया जाता है, और आपके स्वयं को अनदेखा कर दिया जाता है।

यह बेहतर होगा अगर DefaultAnnotationHandlerMapping<mvc:annotation-driven/> द्वारा पंजीकृत डिफ़ॉल्ट की तरह काम करता है, यानी अगर स्पष्ट रूप से घोषित लोगों को प्राथमिकता दी जाती है, लेकिन ऐसा नहीं है कि उन्होंने इसे लिखा है।

मेरी वर्तमान प्राथमिकता <mvc:annotation-driven/> का उपयोग नहीं करना है, यह बहुत भ्रमित है, और अन्य कॉन्फ़िगरेशन विकल्पों के साथ मिश्रित होने पर भी अप्रत्याशित है। यह वास्तव में कुछ भी विशेष रूप से जटिल नहीं करता है, यह आपके लिए जो सामान करता है उसे स्पष्ट रूप से जोड़ने के लिए मुश्किल या वर्बोज़ नहीं है, और अंतिम परिणाम का पालन करना आसान है।

+0

अच्छी व्याख्या। इसे स्वीकार करने के रूप में चिह्नित। मैं एक और प्रश्न पूछूंगा जो अस्पष्ट रहता है - यानी एमवीसी के कुछ हिस्सों को कैसे सक्रिय किया जाए: एनोटेशन-संचालित कर रहा है। – Bozho

+3

https://jira.springsource.org/browse/SPR-6524 ऐसा लगता है कि उसके लिए एक मुद्दा है, और जुर्गेन होलर की टिप्पणियां जो इसका इरादा है। – Bozho

+0

'<बीन आईडी =" वैधकर्ता "वर्ग =" org.springframework.validation.beanvalidation.LocalValidatorFactoryBean "/>' - किसी अन्य प्रश्न की आवश्यकता नहीं :) – Bozho

9

इस व्यवहार का कारण यह है कि अनुप्रयोग संदर्भ में org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping प्रकार के दो बीन्स मौजूद हैं। वसंत दोनों को हल करता है, लेकिन केवल इंटरसेप्टर के लिए पहला पूछता है। इसे ठीक करने के लिए निम्न init पैरामीटर DispatcherServlet

<init-param> 
    <param-name>detectAllHandlerMappings</param-name> 
    <param-value>false</param-value> 
</init-param> 

सेट किया जाना चाहिए क्यों इस डिफ़ॉल्ट व्यवहार है यह डिस्पैचर सर्वलेट उपयोग केवल handlerMappingx-servlet.xml

यह मेरे से परे है में परिभाषित करता है। मैं वसंत समुदाय से एक जवाब की उम्मीद कर रहा हूँ।

+3

' 'नामस्थान का उपयोग करते समय डिफ़ॉल्ट रूप से भ्रमित हैं। मैं अपने आप को सब कुछ निर्दिष्ट करने की पुरानी शैली पसंद करता हूं - नामस्थान कॉन्फ़िगरेशन विधियों को आसानी से नहीं मिला-पर-प्रलेखन में –

3

स्प्रिंग एमवीसी 3.0 में आप हैंडलर मैपिंग को परिभाषित करने के मैनुअल के बजाय <mvc:interceptors> का उपयोग कर सकते हैं।

+2

+1 पर बहुत अधिक भरोसा करना प्रतीत होता है, यह अच्छा है। लेकिन मैं वहां 'रेफरी' का उपयोग नहीं कर सकता। – Bozho

+1

@ बोझो: आप 'बीन रेफरेंस फैक्ट्रीबीन' का उपयोग कर सकते हैं (हाँ, मुझे पता है कि यह बदसूरत है)। – axtavt

+0

हाँ, यह है :) मुझे लगता है कि अब मैं अपने समाधान के साथ रहूंगा। – Bozho

12

समस्या मुझे का सामना करना पड़ा: स्प्रिंग एमवीसी टैग डिफॉल्टएनोटेशन हैंडलर मैपिंग की कस्टम परिभाषा के साथ अच्छी तरह से नहीं चलता है।

क्यों ..? कारण ऊपर दिए गए उत्तरों में बहुत अच्छी तरह से समझाया गया है।

मैं क्यों DefaultAnnotationHandlerMapping उपयोग करना चाहता था? मैं अपने हर अनुरोध के लिए एक इंटरसेप्टर को परिभाषित करना चाहता हूं। उपयोगकर्ता एजेंट ... मोबाइल या ब्राउज़र निर्धारित करने के लिए एक स्प्रिंग-मोबाइल इंटरसेप्टर?

अब MVC-एनोटेशन के इस संघर्ष के कारण और DefaultAnnotationHandlerMapping, मैं DefaultAnnotationHandlerMapping अब और का उपयोग नहीं कर सकते। समस्या नीचे आती है कि मैं अपने इंटरसेप्टर को टैग के साथ कैसे पंजीकृत कर सकता हूं।

समाधान सरल था ... लेकिन खोजने में मुश्किल थी। यह पोस्ट करना यह .. उपयोग टैग अन्य समाधान चाहने वालों के लिए उपयोगी हो सकता है और अपने dispathcer-servlet.xml में उदाहरण रजिस्टर इंटरसेप्टर सेम कर सकते हैं ताकि:

<mvc:interceptors> 
<!-- This runs for all mappings --> 
    <bean class="main.com.XXX.MobileDeviceResolverHanlderInterceptor"/> 
</mvc:interceptors> 
+0

धन्यवाद, बहुत उपयोगी! +1 – ianaz

+0

मैं पहले से ही इन टैग को मेरी 'xxx-servlet.xml' फ़ाइल में डाल चुका हूं, लेकिन फिर भी त्रुटि का सामना कर रहा हूं। –

+0

धन्यवाद आदमी जिसने आपको वास्तव में मदद की –

6

मेरे मामले में मैं नहीं से छुटकारा पा सकते <mvc:annotation-driven/> क्योंकि मैं एनोटेशन का उपयोग कर जेसन समर्थन के लिए जैक्सन का उपयोग कर रहा हूं।

मैं क्या करने की कोशिश की, अलग "xml" फ़ाइल (इंटरसेप्टर-config.xml) में अपने सभी इंटरसेप्टर <mvc:interceptors> चले गए और मेरी एक्स डिस्पैचर-servlet.xml से आयातित

<import resource="interceptor-config.xml"/> 

यह मेरी समस्या का समाधान और डिफ़ॉल्ट 'डिफ़ॉल्टअनोटेशन हैंडलर मैपिंग' से बचें मेरे आवेदन संदर्भ सेम।

अलग 'xml' बनाने के बजाय, आप 'x-dispatcher-servlet.xml' में सीधे इंटरसेप्टर सामग्री कॉपी/पेस्ट कर सकते हैं।

<mvc:interceptors> 
     <mvc:interceptor> 
      <!-- Intercepting specific URL --> 
      <mvc:mapping path="/abc/**" /> 
      <bean id= "myInterceptor" 
       class="xx.xxx.xxx.MyInterceptor" /> 
     </mvc:interceptor> 
<mvc:interceptors> 
संबंधित मुद्दे