2012-11-29 50 views
18

में पुट और डिलीट विधियों का उपयोग करके मैं स्प्रिंग एमवीसी नियंत्रक (संस्करण 3.0.2) में RequestMethod.PUT और RequestMethod.DELETE का उपयोग करने का प्रयास कर रहा हूं। स्प्रिंग कंट्रोलर क्लास में यूआरएल के साथ मैप किए गए तीन तरीके हैं जो क्रमशः प्रदर्शन उद्देश्य के लिए क्रमशः (पुट, जीईटी और पोस्ट करें) हैं।स्प्रिंग एमवीसी

@RequestMapping(method = {RequestMethod.PUT}, value = {"admin_side/Temp"}, headers = {"content-type=multipart/form-data"}) 
public String update(@ModelAttribute("tempBean") TempBean tempBean, BindingResult error, Map model, HttpServletRequest request, HttpServletResponse response) { 
    if (ServletFileUpload.isMultipartContent(request)) { 
     System.out.println("true"); 
    } 

    System.out.println("Request method PUT"); 
    return "admin_side/Temp"; 
} 

@RequestMapping(method = {RequestMethod.GET}, value = {"admin_side/Temp"}) 
public String showForm(@ModelAttribute("tempBean") TempBean tempBean, BindingResult error, Map model, HttpServletRequest request, HttpServletResponse response) { 
    System.out.println("Request method GET"); 
    return "admin_side/Temp"; 
} 

@RequestMapping(method = {RequestMethod.POST}, value = {"admin_side/Temp"}) 
public String onSubmit(@ModelAttribute("tempBean") TempBean tempBean, BindingResult error, Map model, HttpServletRequest request, HttpServletResponse response) { 
    System.out.println("Request method POST"); 
    return "admin_side/Temp"; 
} 

जब पृष्ठ लोड होने पर GET विधि स्पष्ट रूप में, लेकिन अन्य सभी मामलों (जब पेज प्रस्तुत किया जाता है), केवल विधि लागू किया जा करने के लिए POST है में शुरू हो जाती है, विधि RequestMethod.PUT के साथ निर्दिष्ट नहीं है सक्रिय किया गया।


स्प्रिंग प्रपत्र केवल एक बटन और रूप में एक छवि ब्राउज़र सबमिट करें,

<form:form id="mainForm" 
      name="mainForm" 
      method="PUT" 
      action="Temp.htm" 
      enctype="multipart/form-data" 
      commandName="tempBean"> 

    <input type="file" id="myFile" name="myFile"/> 
    <input type="submit" id="btnSubmit" name="btnSubmit" value="Submit"/> 
</form:form> 

सृजित HTML इस प्रकार है के रूप में, में

<form id="mainForm" 
     name="mainForm" 
     action="Temp.htm" 
     method="post" 
     enctype="multipart/form-data"> 

    <input type="hidden" name="_method" value="PUT"/> 
    <!--This hidden field is implicitly included--> 

    <input type="file" id="myFile" name="myFile"/> 
    <input type="submit" id="btnSubmit" name="btnSubmit" value="Submit"/> 
</form> 

मेरी spring-config.xml (dispatcher-servlet.xml मेरे मामले में), मैंने CommonsMultipartResolver का संदर्भ जोड़ा है:

<bean id="filterMultipartResolver" 
     class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/> 

और मेरे web.xml फ़ाइल में, HiddenHttpMethodFilter इस प्रकार कॉन्फ़िगर किया गया है,

<filter> 
    <filter-name>MultipartFilter</filter-name> 
    <filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class> 
    <init-param> 
     <param-name>multipartResolverBeanName</param-name> 
     <param-value>filterMultipartResolver</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>MultipartFilter</filter-name> 
    <servlet-name>/*</servlet-name> 
</filter-mapping> 

<filter> 
    <filter-name>HiddenHttpMethodFilter</filter-name> 
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>HiddenHttpMethodFilter</filter-name> 
    <servlet-name>/*</servlet-name> 
</filter-mapping> 

PUT (और DELETE भी) विधि कभी नहीं शुरू हो जाती है (कोई अपवाद या त्रुटि के साथ)। मुझे यहां क्या समझ नहीं आ रहा है?


अद्यतन:

web.xml में निम्नलिखित विन्यास के साथ

,

<filter> 
    <filter-name>MultipartFilter</filter-name> 
    <filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class> 
    <init-param> <!-- Makes no difference, if excluded. --> 
     <param-name>multipartResolverBeanName</param-name> 
     <param-value>filterMultipartResolver</param-value> 
    </init-param> 
</filter> 

<filter-mapping> 
    <filter-name>MultipartFilter</filter-name> 
    <servlet-name>dispatcher</servlet-name> <!--Changed from /* to dispatcher--> 
</filter-mapping> 

<filter> 
    <filter-name>HiddenHttpMethodFilter</filter-name> 
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>HiddenHttpMethodFilter</filter-name> 
    <servlet-name>dispatcher</servlet-name> <!--Changed from /* to dispatcher--> 
</filter-mapping> 

यह निम्नलिखित अपवाद फेंकता है।

org.springframework.beans.factory.NoSuchBeanDefinitionException: - org.springframework.web.servlet.DispatcherServlet पहले से ही web.xml में मैप किया गया कोई सेम 'filterMultipartResolver' नाम

कहाँ नाम dispatcher सर्वलेट का नाम है परिभाषित किया गया है निम्नलिखित नुसार।

<servlet> 
    <servlet-name>dispatcher</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>2</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>dispatcher</servlet-name> 
    <url-pattern>*.htm</url-pattern> 
</servlet-mapping> 

मुझे यकीन नहीं है कि और क्या चाहिए? क्या फ़िल्टर HiddenHttpMethodFilter हमारे अपने विस्तारित OncePerRequestFilter पर लागू करने के लिए आवश्यक है जैसे here दिखाया गया है? (यह एक अंतर्निहित कक्षा है)

महत्वपूर्ण अंक here सूचीबद्ध हैं।

उत्तर

13

अधिकांश ब्राउज़र HTML फॉर्म में action=PUT का समर्थन नहीं करते हैं। वे इसके बजाय POST अनुरोध भेजेंगे। HiddenHttpMethodFilter आपको समस्या के आसपास आने में मदद करेगा, लेकिन आपको अपने फॉर्म में एक छिपे हुए क्षेत्र _method=PUT को शामिल करना होगा।यदि आप वसंत का उपयोग करते हैं: फॉर्म टैगलिब यह आपके लिए स्वचालित रूप से किया जाएगा, लेकिन आपका उदाहरण सादे HTML का उपयोग करना प्रतीत होता है।

NoSuchBeanDefinitionException शायद एक असंबंधित समस्या है।

+1

लिए मुझे लगता है कि टैग पुस्तकालय का उपयोग कर रहा - ' ...' और छिपी हुई फ़ील्ड '' स्वचालित रूप से जेनरेट किए गए HTML ** में शामिल है जैसा कि प्रश्न में दूसरे और तीसरे कोड स्निपेट में दिखाया गया है। मैंने इस साइट पर और साथ ही साथ अन्य ट्यूटोरियल्स पर इतनी सारी पोस्ट देखी हैं। मैं उनके द्वारा वर्णित लगभग कर रहा हूं हालांकि मामला काम नहीं करता है, मेरे मामले में। मुझे यकीन नहीं है कि मैं क्या खो रहा हूं। जवाब के लिए धन्यवाद। – Tiny

+0

क्षमा करें, मैंने आपकी पोस्ट को गलत तरीके से पढ़ा है ... मेरा बुरा। – Guillaume

+0

आपका टेक्स्ट, "* NoSuchBeanDefinitionException सबसे अधिक असंबंधित समस्या है *" सही है। एकमात्र समस्या यह थी कि मैंने इस 'org.springframework.web.multipart.commons.CommonsMultipartResolver' को गलत कॉन्फ़िगर किया था और इसे' applicationContext.xml' में रखने के बजाय गलत xml फ़ाइल में रखा था। इसलिए, यह अपवाद पैदा कर रहा था। यह अब काम करता है और स्प्रिंग नियंत्रक में 'RequestMethod.PUT' के साथ नामित विधि का आह्वान किया जाता है। एक समस्या अभी भी बनी हुई है कि 'ServletFileUpload.isMultipartContent (अनुरोध)' हमेशा झूठी रिटर्न देता है। यह केवल 'POST' पर सत्य देता है। क्या आपको कारण पता है? – Tiny

1

आपको अपनी कॉन्फ़िगरेशन बदलनी चाहिए।

<servlet-name>/*</servlet-name> 

<servlet-name>[dispatch servlet name]</servlet-name>