在DELETE请求的主体中传递数据
我有两种Spring
MVC控制器方法。两者都接收请求体中相同的数据(在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
path变量而被初始化)。
我可以看到该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
(至少对于我检查过的7.0.54版本,但对于所有Tomcat
7版本而言,它都是相同的)时,Tomcat仅解析形式为样式的参数。
为了能够处理DELETE方法,您需要设置parseBodyMethods
Tomcat连接器的属性。连接器配置在中完成server.xml
。
更新后的连接器很可能看起来像:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
redirectPort="8443"
parseBodyMethods="POST,PUT,DELETE"
URIEncoding="UTF-8" />
这是用于配置Tomcat连接器的文档页面。
一旦设置了Tomcat来解析参数,Spring就可以正常工作(尽管在这种情况下,您可能需要@RequestBody
从controller方法中删除)
以上是 在DELETE请求的主体中传递数据 的全部内容, 来源链接: utcz.com/qa/418967.html