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

标签 spring spring-mvc

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

相关文章:

java - 奇怪的 org.springframework.jdbc.BadSqlGrammarException

java - 如何配置 Spring 来部分或选择性地覆盖属性?

java - 如何使用 Spring MVC 在外部 Web 服务器上托管 JSP 页面以进行更多动态编辑

spring-mvc - 将 Spring Data Rest 重新配置为第 1 页的索引

java - Spring Batch 一次处理多个项目

java - Spring Web Flow 和 Spring MVC URL 404

java - NoSuchMethodError 与 Spring MutableValues

java - Spring 清除 session 范围 bean

Java/Spring-Boot Web 应用程序不提供公共(public)资源目录中的 Assets

Spring flash 属性在反向代理后面不起作用