gpt4 book ai didi

spring - 在 DELETE 请求的正文中传递数据

转载 作者:IT老高 更新时间:2023-10-28 13:47:30 35 4
gpt4 key购买 nike

我有两个 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/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com