Spring Web MVC:HTTP DELETE不再有请求体

Joh*_*gel 7 java spring spring-mvc spring-web

我对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) {
        ...
Run Code Online (Sandbox Code Playgroud)

我们发送

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

[ {
  "any field" : "Any value"
} ]
Run Code Online (Sandbox Code Playgroud)

并得到例外

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)
    ...
Run Code Online (Sandbox Code Playgroud)

似乎请求正文已被删除.

如果我们在任何地方使用HTTP POST而不是HTTP DELETE,它可以正常工作.

以前它工作正常(抱歉我之前无法指定,因为我们的依赖关系非常复杂.如果它对你有帮助,我可以发布一个旧的build.gradle).

为什么不再可能了?

sp0*_*00m 6

您可能应该重新设计您的 API,因为 DELETE 请求中的有效负载应该被忽略。

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

DELETE 请求消息中的有效负载没有定义的语义。

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

如果请求方法不包括为实体主体定义的语义,那么在处理请求时应该忽略消息主体。


Joh*_*gel 1

看来是zuul的问题。没有 zuul 就可以了。春天与此无关。