在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可能由于idpath变量而被初始化)。

我可以看到该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方法,您需要设置parseBodyMethodsTomcat连接器的属性。连接器配置在中完成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

回到顶部