2011-05-05 18 views
17

का उपयोग करते हुए अनुरोध बॉडी पैरामीटर को पहचान नहीं रहा है, शायद यह काम नहीं करना चाहिए, लेकिन कम से कम मैं समझना चाहता हूं कि क्यों। मैं PUT शरीर में एक साधारण वैल = कुछवल गुजर रहा हूं लेकिन वसंत 400 Bad Request भेजता है क्योंकि यह वैल पैरामीटर को पहचानने के लिए प्रतीत नहीं होता है।स्प्रिंगएमवीसी पुट

इसी तरह का अनुरोध POST के साथ काम करता है। क्या यह हो सकता है SpringMVC पैरामीटर के लिए स्रोत के रूप में PUT अनुरोध निकाय को पहचान नहीं रहा है?

Content=-Type दोनों मामलों में एप्लिकेशन/एक्स-www-form-urlencoded के लिए सही ढंग से सेट किया गया है।

विधि है कि वसंत कॉल करने के लिए मना कर दिया यह है:

@RequestMapping(value = "config/{key}", method = RequestMethod.PUT) 
@ResponseBody 
public void configUpdateCreate(final Model model, @PathVariable final String key, @RequestParam final String val, 
     final HttpServletResponse response) throws IOException 
{ 
    //... 
} 

पूर्णता के लिए, यहाँ jQuery ajax कॉल है। मैं इसके साथ कुछ भी गलत नहीं देख सकता। क्लाइंट फ़ायरफ़ॉक्स 4 या क्रोम है, दोनों एक ही परिणाम दिखाते हैं।

$.ajax({ 
     url:url, 
     type:'PUT', 
     data:'val=' + encodeURIComponent(configValue), 
     success: function(data) {...} 
     });  

कोई विचार?

+0

जब आप इसे POST में बदलते हैं तो यह काम करता है? –

+0

आप एक विधि विधि में @ResponseBody के साथ विधि को एनोटेट क्यों करते हैं? उस एनोटेशन को इंगित करना है कि वापसी का प्रकार सीधे HTTP प्रतिक्रिया निकाय को लिखा जाना चाहिए। मुझे लगता है कि यह मामला नहीं है। आप इसे भी करने का प्रयास कर सकते हैं: डेटा: {'val', encodeURIComponent (configValue)}, – Javi

+0

400 कोड के साथ वापस आने वाला त्रुटि संदेश क्या है? – skaffman

उत्तर

19

मैं यहाँ इस बिंदु पर चारों ओर एक काम के बारे में पता नहीं है, लेकिन बग रिपोर्ट है कि एक "नहीं होगा ठीक कर।" मैं एक ही मुद्दा लड़ रहा है

https://jira.springsource.org/browse/SPR-7414

अद्यतन: यहाँ मेरी ठीक है। मैं RequestBody एनोटेशन का उपयोग कर रहा हूँ। फिर MultiValueMap का उपयोग कर।

http://static.springsource.org/spring/docs/3.0.5.RELEASE/reference/mvc.html#mvc-ann-requestbody

@RequestMapping(value = "/{tc}", method = RequestMethod.PUT) 
public void update(@PathVariable("tc") final String tc, 
@RequestBody MultiValueMap<String,String> body, HttpServletResponse response) { 

    String name = body.getFirst("name"); 
// more code 
} 
+1

यह भी देखें: http://markmail.org/thread/bqb44tqnhmvtlji6 –

+0

टॉमकैट सूची पर चर्चा के लिंक के लिए धन्यवाद, यह इस मुद्दे को स्पष्ट करता है। मेरे मामले में @RequestBody एनोटेशन के साथ समाधान एक मल्टीमैप के बजाय कस्टम मॉडल/फॉर्म-बैकिंग-बीन क्लास के साथ काम नहीं करता था। तो मैं HiddenHttpMethodFilter का उपयोग कर रहा हूं और मैं jQuery से एक POST अनुरोध भेज रहा हूं जिसमें _method = put param को इसके बजाय, php-coder का सुझाव दिया गया है। – meyertee

1

मैं आप के लिए सही समाधान नहीं है, लेकिन आपके मामले में मैं निम्न प्रयास करें:

  • form:form method="PUT"
  • साथ पृष्ठ बनाने की घोषणा web.xml में HiddenHttpMethodFilter

यदि यह काम करता है होगा, तो

  • type से बदलें PUT ajax कॉल
  • जोड़ने की जरूरत पैरामीटर जो ग्राहक, form:form टैग (_method की तरह कुछ)

दूसरे शब्दों में साथ है के रूप में मैं समझता हूँ कि वसंत emulates PUT विशेष पैरामीटर के साथ सरल POST के आधार पर में POST करने के लिए। बस उसे भेजें कि वह क्या चाहता है।

यह भी देखें: http://stsmedia.net/spring-finance-part-2-spring-mvc-spring-30-rest-integration/ और संबंधित कोड वहाँ उदाहरण: http://code.google.com/p/spring-finance-manager/source/browse

HTH

1

यह, जैसा कि ऊपर का सुझाव, spring/servlet API में एक बग हो रहा है। हकीकत में PUT अनुरोध Request Body (or payload) पर काम करना चाहिए और अनुरोध पैरामीटर्स पर नहीं। उस अर्थ में, सर्वलेट एपीआई & वसंत की हैंडलिंग सही है।

यह कहकर, एक बेहतर और अधिक आसान कामकाज आपके javascript/jQuery कॉल से कोई डेटा तत्व पास नहीं करना है और यूआरएल के हिस्से के रूप में अपने पैरामीटर को पास करना है। अर्थात्, यूआरएल फ़ील्ड में पैरामीटर सेट करें जिस तरह से आप GET कॉल में करेंगे।

$.ajax({ 
      url: "yoururl" + "?param1=param2Val&..", 
      type: "PUT", 
      data: "", 
      success: function(response) { 
       // .... 
      } 
    }); 

अब इस सरल मापदंडों के लिए काम करता है, मैं लगता है, जटिल JSON प्रकार के लिए काम नहीं करेगा। उम्मीद है की यह मदद करेगा।

12

Since वसंत 3.1, यह org.springframework.web.filter.HttpPutFormContentFilter का उपयोग करके हल किया गया है।

<filter> 
    <filter-name>httpPutFormContentFilter</filter-name> 
    <filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>httpPutFormContentFilter</filter-name> 
    <servlet-name>rest</servlet-name> 
</filter-mapping> 
+1

तुम मेरे नायक हो! –

+0

यह आपके web.xml में जाएगा – tibi

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