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 DELETE, все работает нормально.

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

Почему больше нельзя?


person Johannes Flügel    schedule 25.02.2016    source источник
comment
Итак, что вы изменили, так как это заработало?   -  person Ralph    schedule 25.02.2016
comment
@Ralph: мы ничего не изменили. В нашем build.gradle у нас есть такие зависимости, как compile 'org.springframework.security:spring-security-web:4.0.+', поэтому, возможно, любая зависимость была автоматически обновлена ​​Gradle.   -  person Johannes Flügel    schedule 25.02.2016
comment
Как отправить запрос?   -  person shazin    schedule 25.02.2016
comment
@shazin Я отправляю запрос через почтальона. Но через org.springframework.web.client.RestTemplate тоже не получается.   -  person Johannes Flügel    schedule 25.02.2016


Ответы (2)


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

Из http://tools.ietf.org/html/rfc7231#section-4.3. 5:

Полезная нагрузка в сообщении запроса DELETE не имеет определенной семантики.

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

Если метод запроса не включает определенную семантику для тела объекта, то тело сообщения СЛЕДУЕТ игнорировать при обработке запроса.

person sp00m    schedule 26.02.2016

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

person Johannes Flügel    schedule 26.02.2016
comment
Для spring-cloud-netflix зарегистрирована проблема, связанная с игнорированием тела запроса DELETE: github.com/spring-cloud/spring-cloud-netflix/issues/949 - person jett; 21.08.2016