2016-02-25 5 views
7

मेरे पास स्प्रिंग वेब एमवीसी के डेवलपर्स के लिए एक प्रश्न है।स्प्रिंग वेब एमवीसी: HTTP DELETE के लिए कोई अनुरोध निकाय संभव नहीं है

संक्षेप में: पहले एक HTTP डिलीट संदेश में अनुरोध निकाय भेजना संभव था, लेकिन अब यह अब संभव नहीं है। क्यूं कर?

विस्तार में:

हम spring-webmvc-4.2.4.RELEASE उपयोग कर रहे हैं।

@RestController 
public class Controller { 

    @RequestMapping(value = "/{pathVariable}/deleteAnything", method = RequestMethod.DELETE) 
    public ResponseEntity<?> deleteAnything(@PathVariable String pathVariable, 
     @Valid @RequestBody Set<Pojo> pojoSet) { 
     ... 

हम

DELETE /anything/deleteAnything HTTP/1.1 
Content-Type: application/json 
Host: example.com 

[ { 
    "any field" : "Any value" 
} ] 

भेजने और अपवाद

m.m.a.RequestResponseBodyMethodProcessor : Read [java.util.Set<packagename.Pojo>] as "application/json;charset=UTF-8" with [org.springfr[email protected]333825a3] 
.w.s.m.m.a.ServletInvocableHandlerMethod : Error resolving argument [1] [type=java.util.Set] 
HandlerMethod details: 
Controller [packagename.Controller] 
Method [public org.springframework.http.ResponseEntity<?> packagename.Controller.deleteAnything(java.lang.String,java.util.Set<packagename.Pojo>)] 


org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public org.springframework.http.ResponseEntity<?> packagename.Controller.deleteAnything(java.lang.String,java.util.Set<packagename.Pojo>) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:151) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:125) 
    ... 

ऐसा लगता है कि अनुरोध शरीर हटा दिया गया है मिलता है।

यदि हम हर जगह HTTP DELETE के बजाय HTTP POST का उपयोग करते हैं, तो यह ठीक काम करता है।

पहले यह ठीक काम किया (खेद है क्योंकि हमारी निर्भरता बहुत जटिल हैं कि मैं पहले निर्दिष्ट नहीं कर सकते। यदि यह आप में मदद करता है, मैं पोस्ट कर सकते हैं एक पुराने build.gradle)।

अब और क्यों संभव नहीं है?

+0

तो यह काम करने के बाद से आपने क्या बदल दिया? – Ralph

+0

@ राल्फ: हमने कुछ भी नहीं बदला। हमारे 'build.gradle' में हमारे पास' compile 'org.springframework.security:spring-security-webliament.0। +' 'जैसी निर्भरताएं हैं, इसलिए शायद किसी भी निर्भरता को धीरे-धीरे क्रमशः अपडेट किया गया है। –

+0

आप अनुरोध कैसे भेजते हैं? – shazin

उत्तर

1

यह ज़ुउल के साथ एक समस्या प्रतीत होता है। ज़ुल के बिना यह काम करता है। वसंत के पास इसके साथ कुछ लेना देना नहीं है।

+1

DELETE अनुरोध निकाय निकाय के लिए वसंत-क्लाउड-नेटफ्लिक्स के लिए कोई समस्या लॉग इन की गई है: https://github.com/spring-cloud/spring-cloud-netflix/issues/949 – jett

3

आपको शायद अपने एपीआई को फिर से डिजाइन करना चाहिए, क्योंकि DELETE अनुरोधों के भीतर पेलोड को अनदेखा किया जाना चाहिए।

http://tools.ietf.org/html/rfc7231#section-4.3.5 से

:

एक हटाने का अनुरोध संदेश के भीतर एक पेलोड कोई परिभाषित अर्थ विज्ञान है।

https://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.3 से

:

हैं अनुरोध विधि एक इकाई शरीर के लिए परिभाषित अर्थ विज्ञान में शामिल हैं, तो संदेश-शरीर जब अनुरोध पर कार्य अनदेखा किया जाना चाहिए नहीं है।

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