Spring Web MVC: больше нет тела запроса для HTTP DELETE

у меня есть вопрос для разработчиков Spring Web MVC.

в двух словах: раньше можно было отправить тело запроса в сообщении HTTP DELETE, но теперь это больше невозможно. Почему?

подробнее:

мы используем 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.springframework.http.converter.json.MappingJackson2HttpMessageConverter@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 POST вместо HTTP Удалить везде, он работает нормально.

ранее он работал нормально (извините, что я не могу указать ранее потому что наши зависимости очень сложно. Если это поможет вам, я могу опубликовать старый build.gradle).

почему это невозможно?

2 ответов


вы, вероятно, должны перепроектировать свой API, как полезные нагрузки в запросах удаления должны игнорируется.

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

груз в удалить сообщение-запрос имеет определенную семантику.

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

Если метод запроса не включает определенный семантика для entity-body, тогда тело сообщения следует игнорировать при обработке запрос.


кажется, это проблема с zuul. Без зуула это работает. Весна тут ни при чем.