2016-02-25 9 views
7

Ho una domanda per gli sviluppatori di Spring Web MVC.Spring Web MVC: nessun corpo richiesta possibile per HTTP DELETE più

In breve: in precedenza era possibile inviare un corpo di richiesta in un messaggio DELETE HTTP, ma ora non è più possibile. Perché?

In dettaglio:

Stiamo utilizzando 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) { 
     ... 

Inviamo

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

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

e ottenere l'eccezione

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

Sembra che il corpo della richiesta è stata rimossa.

Se utilizziamo HTTP POST anziché HTTP DELETE ovunque, funziona correttamente.

In precedenza ha funzionato bene (mi dispiace che non posso specificare precedentemente perché i nostri dipendenze sono molto complicate. Se si aiuta, posso pubblicare un vecchio build.gradle).

Perché non è più possibile?

+0

Quindi cosa hai cambiato, dal momento che ha funzionato? – Ralph

+0

@ Ralph: non abbiamo cambiato nulla. Nel nostro 'build.gradle' abbiamo dipendenze come' compile 'org.springframework.security:spring-security-web:4.0. +' ', Quindi forse ogni dipendenza è stata aggiornata automaticamente da gradle. –

+0

Come si invia la richiesta? – shazin

risposta

1

Sembra essere un problema con zuul. Senza zuul funziona. La primavera non ha niente a che fare con questo.

+1

È stato registrato un problema per spring-cloud-netflix perché il corpo della richiesta DELETE è stato ignorato: https://github.com/spring-cloud/spring-cloud-netflix/issues/949 – jett

3

Probabilmente è necessario riprogettare la propria API, in quanto i payload all'interno delle richieste DELETE devono essere ignorati.

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

un payload all'interno di un messaggio di richiesta di eliminazione non ci sono semantica definita.

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

Se il metodo di richiesta non include semantica definita per un'entità-corpo , quindi il messaggio-corpo deve essere ignorato quando gestisce la richiesta .

Problemi correlati