2011-08-26 13 views
5

मेरी प्रोजेक्ट में नए एनोटेशन-आधारित नियंत्रकों के साथ पुराने गैर-एनोटेटेड नियंत्रक शामिल हैं।<mvc: एनोटेशन-संचालित /> गैर-एनोटेटेड नियंत्रकों के साथ

मैं नवीनतम स्प्रिंग जार (3.0.5) का उपयोग कर रहा हूं और मेरे प्रेषक-servlet.xml में <mvc:annotation-driven /> है।

समस्या यह है कि <mvc:annotation-driven /> अनुरोध मैपिंग (प्रेषक-servlet.xml में नियंत्रक सेम की नाम संपत्ति के माध्यम से) मेरे गैर-एनोटेटेड नियंत्रकों को काम नहीं करने का कारण बनता है ... हर बार जब मैं अनुरोध को निर्देशित करता हूं अन-एनोटेट नियंत्रक मैं इस तरह के रूप में एक त्रुटि संदेश मिल रहा है:

org.springframework.web.servlet.DispatcherServlet noHandlerFound 
WARNING: No mapping found for HTTP request with URI [/some_path/some_page.htm] in DispatcherServlet with name 'dispatcher' 

मैं अन-एनोटेट नियंत्रकों कैसे रख सकते हैं के रूप में वे कर रहे हैं लेकिन उनके (पुरानी शैली) मानचित्रण पहचान करने के लिए वसंत बता सकते हैं?

मैं पहले से मौजूद नियंत्रकों के जावा कोड में न्यूनतम परिवर्तन के साथ समाधान ढूंढ रहा हूं।

धन्यवाद!

उत्तर

6

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

आपके पास 2 विकल्प हैं। कोशिश करने की पहली बात <mvc:annotation-driven /> को निकालना है। आप अभी भी इसके बिना एनोटेटेड नियंत्रकों का उपयोग कर सकते हैं। यह जैक्सन JSON समर्थन जैसी अतिरिक्त सुविधाएं जोड़ता है, लेकिन यदि आपको उन अतिरिक्त सुविधाओं की आवश्यकता नहीं है, तो आपको इसकी आवश्यकता नहीं है। तो <mvc:annotation-driven /> के बिना अपने ऐप को आज़माएं और देखें कि यह अभी भी काम करता है या नहीं।

विफल होने पर, आप अपने पुराने नियंत्रकों के लिए मैपिंग और एडाप्टर को दोबारा स्थापित कर सकते हैं। आप यह नहीं कह था कि कैसे अपने नियंत्रकों द्वारा उनके URL मैप किया गया है के लिए इस्तेमाल किया है, लेकिन अपने config करने के लिए इन जोड़ने का प्रयास करें:

<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> 
<bean class="org.springframework.web.servlet.handler.ControllerClassNameHandlerMapping"/> 

यदि आप SimpleUrlHandlerMapping इस्तेमाल किया है, तो पहले से ही काम करना चाहिए।

<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> 

बस आँख बंद करके में इन न जोड़ें:

तुम भी HandlerAdapter में वापस जोड़ने की जरूरत है। उन्हें व्यक्तिगत रूप से आज़माएं, और देखें कि आपके पुराने नियंत्रक नए लोगों के साथ काम करने के लिए न्यूनतम सेट क्या है।

+0

इस बहुत ही उपयोगी उत्तर के लिए धन्यवाद। मेरे पुराने नियंत्रकों ने मैपिंग के लिए नाम = यूआरएल विधि का उपयोग किया है, इसलिए मैंने अपने dispatcher-servlet.xml पर BeanNameUrlHandlerMapping जोड़ा है और यह फिर से काम करता है।आपके उत्तर के बाद मैंने हैंडलर मैपिंग्स और हैंडलर एडेप्टर के बारे में पढ़ने के लिए कुछ समय निकाला है (उनके बारे में नहीं पता था)। अब मेरा प्रश्न स्प्रिंग 3 में है, जो हैंडलर मैपिंग्स और हैंडलर एडेप्टर स्वचालित रूप से परिभाषित किए जाते हैं? मुझे लगता है कि DefaultAnnotationHandlerMapping और AnnotationMethodHandlerAdapter लेकिन कोई अन्य? क्या आप मुझे दस्तावेज और/या कोड में बताए गए निर्देशों के लिए निर्देशित कर सकते हैं? एक बार फिर धन्यवाद! – rapt

6

मैंने पाया कि एमवीसी विस्फोट करके: एनोटेशन-संचालित इसके वास्तविक प्रतिस्थापन में संचालित, यह पता लगाना आसान था। यह करने के लिए

<mvc:annotation-driven /> फट:

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
    <property name="order" value="0" /> 
</bean> 

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="webBindingInitializer"> 
     <bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer"> 
      <property name="validator" ref="validator" /> 
     </bean> 
    </property> 
    <property name="messageConverters"> 
     <list> 
      <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter" /> 
      <bean class="org.springframework.http.converter.StringHttpMessageConverter" /> 
      <bean class="org.springframework.http.converter.FormHttpMessageConverter" /> 
      <bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter" /> 
     </list> 
    </property> 
</bean> 

<!-- Configures a validator for spring to use --> 
<bean id="validator" class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"> 
    <property name="messageInterpolator"> 
     <bean class="com.eps.web.spring.validation.SpringMessageSourceMessageInterpolator" /> 
    </property> 
</bean> 

<bean id="conversion-service" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" /> 

एक बार जादू चला गया था, मैं एक "पुराने" नियंत्रक लोड करने का प्रयास यह त्रुटि आई: javax.servlet.ServletException: No adapter for handler [or[email protected]

उस बिंदु से, मैं

जोड़ा
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" /> 

और मेरे सभी पुराने नियंत्रक काम करते थे।

+0

आपके समाधान के लिए, ब्रैड, धन्यवाद। यह मेरे लिए काम किया। दिलचस्प है कि अगर मैं कॉन्फ़िगरेशन में "एमवीएन: एनोटेशन-संचालित" डालता हूं, तो मुझे "एप्लिकेशन लूप रीडायरेक्ट कर रहा है" त्रुटि संदेश मिलता है, लेकिन विस्फोटित संस्करण ठीक काम कर रहा है। –

+0

मैं पुराने नियंत्रकों के लिए SimpleUrlHandlerMapping का उपयोग कर रहा था। वसंत 2.5 के साथ। निम्नलिखित में जोड़कर केक के टुकड़े की तरह काम करने के लिए एनोटेटेड और पुराने नियंत्रक दोनों सक्षम हैं! <सेम वर्ग = "org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /> <सेम वर्ग = "org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" /> <संदर्भ: घटक -स्कैन बेस-पैकेज = "[आपका पैकेज]" /> \t <बीन क्लास = "org.springframework.web.servlet.mvc. सिंपल कंट्रोलर हैंडलर एडाप्टर" /> । धन्यवाद! – JackDev

+0

क्या कोई यह देख रहा है कि आपका समाधान क्यों काम करता है? ऐसा इसलिए था क्योंकि स्प्रिंग एक डिफ़ॉल्ट एडाप्टर सेट के साथ आया था, और "एनोटेशन मैथ्यू हैंडलर एडाप्टर" को परिभाषित करना सरल एडाप्टर सेटिंग को ओवरराइट करता है? – JackDev

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