我有两个 Spring MVC Controller 方法。两者都在请求正文中接收相同的数据(采用 HTLM POST
形式的格式:version=3&name=product1&id=2
),但一种方法处理 PUT
请求和另一个 DELETE
:
@RequestMapping(value = "ajax/products/{id}", method = RequestMethod.PUT)
@ResponseBody
public MyResponse updateProduct(Product product, @PathVariable("id") int productId) {
//...
}
@RequestMapping(value = "ajax/products/{id}", method = RequestMethod.DELETE)
@ResponseBody
public MyResponse updateProduct(Product product, @PathVariable("id") int productId) {
//...
}
在第一种方法中,product
参数的所有字段都已正确初始化。在第二种情况下,只有 id
字段被初始化。其他字段为 null
或 0。(id
可能由于 id
路径变量而被初始化。
我可以看到 HttpServletRequest
对象包含请求正文中所有字段的值(version=3&name=product1&id=2
)。它们只是没有映射到 product
参数的字段。
我怎样才能使第二种方法起作用?
我也尝试使用 @RequestParam
注释参数。在处理 PUT
请求的方法中,它可以工作。在 DELETE
方法中,我得到一个异常:org.springframework.web.bind.MissingServletRequestParameterException: Required String parameter 'version' is not present
。
我需要在 DELETE
请求的主体中传递数据,因为数据包含用于乐观锁定的行版本。
最佳答案
问题不是Spring
问题,而是Tomcat
问题。
默认情况下,当 HTTP 方法为 POST
时,Tomcat 只会解析表单样式的参数(至少对于我检查的 7.0.54 版本,但对于所有 Tomcat 可能都是相同的7 个版本)。
为了能够处理 DELETE 方法,您需要设置 Tomcat 连接器的 parseBodyMethods
属性。连接器配置在 server.xml
中完成。
您更新后的连接器很可能如下所示:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
parseBodyMethods="POST,PUT,DELETE"
URIEncoding="UTF-8" />
Here是配置 Tomcat 连接器的文档页面。
一旦你设置 Tomcat 来解析参数,Spring 就可以正常工作(尽管在你的情况下,你可能需要从 Controller 方法中删除 @RequestBody
)
关于spring - 在 DELETE 请求的正文中传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25375046/