2013-05-08 3 views
8

मैं यह पता लगाने की कोशिश कर रहा हूं कि मुझे jQuery.ajax कॉल से अनुरोध क्यों प्राप्त नहीं हो सकता है जब वसंत @Controller हैंडलर विधि में @RequestBody एनोटेशन शामिल है। निम्नलिखित पर विचार करें:वसंत @ एमवीसी और @RequestBody एनोटेशन एक्स-www-form-urlencoded डेटा के साथ?

HTML/जावास्क्रिप्ट:

<form id="foo" action="/baz"> 
    <input name="bar"> 
</form> 

<script> 
    $(function() { 
    var $fooForm = $('#foo'); 

    $fooForm.on('submit', function(evt) { 
     evt.preventDefault(); 

     $.ajax({ 
     url: $fooForm.action, 
     data: $fooForm.serialize(), 
     dataType: 'json', 
     type: 'POST', 
     success: function(data) { console.log(data); } 
     }); 
    }); 
    }); 
</script> 

जावा:

@RequestMapping(
    value = "/baz", 
    method = RequestMethod.POST, 
    consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, 
    produces = MediatType.APPLICATION_JSON_VALUE 
) 
public @ResponseBody SearchResults[] jqueryPostHandler(
    @RequestBody FormDataObject formData) 
{ 
    return this.searchService.find(formData); 
} 

ऊपर (कोई अपवाद के साथ @RequestBody एनोटेशन वर्तमान असफल और एक 415 त्रुटि लौटाएगा होगा उत्पन्न हो)। लेकिन अगर @RequestBody एनोटेशन हटा दिया गया है (यानी पैरामीटर हस्ताक्षर सिर्फ FormDataObject formData है) तो विधि को कॉल किया जाएगा और JSON जावास्क्रिप्ट पर वापस कर दिया जाएगा।

ऐसा क्यों है? POST अनुरोध में अनुरोध के शरीर में डेटा शामिल है। एनोटेशन प्रक्रिया ऐसी अनुरोध नहीं करनी चाहिए?

मुझे एहसास है कि मैं जावास्क्रिप्ट द्वारा भेजे गए सामग्री प्रकार को application/json और consumes संपत्ति MediaType.APPLICATION_JSON_VALUE पर एनोटेशन कार्य सही तरीके से करने के लिए बदल सकता है। लेकिन यह सामान्य फॉर्म अनुरोध के साथ क्यों काम नहीं करता है?

नोट: मैं वसंत 3.1.4 का उपयोग कर रहा हूँ।

+0

http://matthewsalvatore.blogspot.com.br/2013 /08/spring-framework-working-with-x-www.html – Allenaz

उत्तर

7

क्या आपने लौटे हुए स्टेटस कोड के कारण का पता लगाने के लिए 'org.springframework.web' पर लॉगिंग चालू करने का प्रयास किया है? वहाँ एक अपवाद उठाया और लॉग इन करने से पहले इसे एक 415

में अनुवाद किया है इसके अलावा प्रपत्र डेटा भेजा जा रहा हो, क्यों सिर्फ @RequestBody बाहर छोड़ नहीं होना चाहिए। फिर आप डेटा बाध्यकारी (यानी @ModelAttribute) का उपयोग करेंगे जो फ़ील्ड ऑब्जेक्ट करने के लिए सर्वलेट अनुरोध पैरामीटर लागू करेगा। FormHttpMessageConverter का उपयोग करना बेहतर है।

+0

लॉगिंग को चालू करने से पता चलता है कि '@ RequestBody' एनोटेशन के साथ यह _does_ मानचित्र पर है सही विधि, लेकिन यह "org.springframework.web.HttpMediaTypeNotSupportedException फेंकता है: सामग्री प्रकार 'एप्लिकेशन/एक्स-www-form-urlencoded; charset = UTF-8' समर्थित नहीं है"। –

+0

मेरी सीमित समझ से, एनोटेशन '@ रिक्वेस्ट बॉडी' का तात्पर्य है कि संसाधित होने वाला डेटा अनुरोध के मुख्य भाग में होगा। यह कोड पढ़ने वाले व्यक्ति कंपाइलर _and_ को सूचित करता है। तो, इसे छोड़कर संदिग्ध कोड बनाता है। यही कारण है कि मैं जानना चाहता हूं कि यह क्यों विफल रहा है। –

6

Spring Docs of @RequestBody कहता है, अनुरोध निकाय को HttpMessageConverter द्वारा आपके ऑब्जेक्ट में परिवर्तित कर दिया जाएगा।

  • ByteArrayHttpMessageConverter: बाइट सरणियों धर्मान्तरित

    4 डिफ़ॉल्ट HttpMessageConverters रहे हैं।

  • StringHttpMessageConverter: तारों को परिवर्तित करता है।
  • FormHttpMessageConverter: मल्टीवैल्यूमैप से फॉर्म डेटा को कनवर्ट करता है।
  • SourceHttpMessageConverter: को javax.xml.transform.Source से कनवर्ट करता है।

url एन्कोडेड फ़ॉर्म को बदलने के लिए, जो ajax.serialize() है, यह FormHttpMessageConverter का काम है। चूंकि आपके पास HttpMediaTypeNotSupportedException अपवाद है, मुझे लगता है कि आपने FormHttpMessageConverter कॉन्फ़िगर नहीं किया है। अपने वसंत विन्यास फाइल की जाँच करें, यहाँ एक उदाहरण है:

< bean class ="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" > 
    < property name= "messageConverters" > 
     < list> 
      < ref bean= "mappingJacksonHttpMessageConverter" /> 
      < ref bean= "stringHttpMessageConverter" /> 
      <!-- Do you have this converter ? --> 
      < ref bean= "formHttpMessageConverter" /> 
     </ list> 
    </ property> 
</ bean> 
+0

उपरोक्त मेरे लिए काम नहीं किया, भले ही मैंने सभी कन्वर्टर्स जोड़े। मुझे इसे बनाने के लिए http://stackoverflow.com/a/31083802/471213 पर कस्टम कनवर्टर का उपयोग करना था –

+0

@ usr-local-ΕΨΗΕΛΩΝ क्या आपकी समस्या इस प्रश्न के समान है? मेरा जवाब इस प्रश्न के लिए है, और यदि आपका अलग है, या शायद आपको अधिक जानकारी देने के लिए एक नया प्रश्न पूछना चाहिए। – Qianyue

+0

एक ही सटीक समस्या नहीं: JSON सबमिट करते समय फ़ॉर्म और सफलता सबमिट करते समय मुझे त्रुटि 406 होती है। हालांकि, स्प्रिंग से कोड के साथ डीबग करने से पहले, मुझे समझ में नहीं आया कि अनुरोध इकाई ** ** को 'FormHttpMessageConverter' के साथ काम करने के लिए' मल्टीवैल्यूमैप 'को लागू करना होगा। तो * अब * मुझे लगता है कि ओपी का 'फॉर्मडाटा ऑब्जेक्ट' उस इंटरफेस को लागू करता है या अन्यथा मुझे ओपी के समान समस्या है लेकिन यह कनवर्टर काम नहीं कर रहा है। और जिस तरह से मैं स्प्रिंग 4.2 –

-2

समस्या यह है कि जब हम आवेदन/x-www फार्म-urlencoded उपयोग करते हैं, वसंत एक RequestBody के रूप में यह नहीं समझती है।इसलिए, अगर हम इस का उपयोग करना चाहते हैं तो हमें @RequestBody एनोटेशन को हटाना होगा।

फिर कोशिश निम्नलिखित:

@RequestMapping(
     value = "/baz", 
     method = RequestMethod.POST, 
     consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, 
     produces = MediatType.APPLICATION_JSON_VALUE 
) 
public @ResponseBody SearchResults[] jqueryPostHandler(
     FormDataObject formData) 
{ 
    return this.searchService.find(formData); 
} 

ध्यान दें कि एनोटेशन @RequestBody

जवाब हटाया: Http Post request with content type application/x-www-form-urlencoded not working in Spring

+1

ओपी ने पहले ही इसका उल्लेख किया है। उनका सवाल यही है। –

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