2016-02-25 8 views
7

Mam pytanie do twórców Spring Web MVC.Spring Web MVC: nie jest już możliwe wysyłanie żądania dla HTTP DELETE

Krótko mówiąc: wcześniej możliwe było wysłanie treści żądania w wiadomości HTTP DELETE, ale teraz nie jest to już możliwe. Czemu?

w szczegółach:

Używamy 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) { 
     ... 

mobilna

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

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

i uzyskać wyjątek

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) 
    ... 

Wydaje się, że ciało wniosek został usunięty.

Jeśli używamy HTTP POST zamiast HTTP DELETE wszędzie, to działa dobrze.

Wcześniej pracował grzywny (przepraszam, że nie można określić poprzednio ponieważ nasze zależności są bardzo skomplikowane. Jeśli to pomaga, mogę pisać starą build.gradle).

Dlaczego nie jest to już możliwe?

+0

Co zmieniłeś, ponieważ zadziałało? – Ralph

+0

@Ralph: nic nie zmieniliśmy. W naszym 'build.gradle' mamy zależności takie jak' compile 'org.springframework.security:spring-security-web:4.0. +' ', Więc być może każda zależność została automatycznie zaktualizowana przez gradle. –

+0

Jak wysłać prośbę? – shazin

Odpowiedz

1

Wygląda na to, że problem dotyczy zuul. Bez zuul działa. Wiosna nie ma z tym nic wspólnego.

+1

Wystąpił problem związany z chmurą wiosenną-netflix dla ignorowania treści żądania DELETE: https://github.com/spring-cloud/spring-cloud-netflix/issues/949 – jett

3

Prawdopodobnie powinieneś przeprojektować swoje API, ponieważ ładunki w ramach żądań DELETE powinny zostać zignorowane.

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

ładunek w komunikacie żądania DELETE nie ma zdefiniowanych semantykę.

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

Jeśli metoda prośba nie obejmuje zdefiniowanych semantykę dla danej jednostki -ciele, wówczas wiadomość ciała powinny być ignorowane podczas obsługi żądania .

Powiązane problemy