解决SpringBoot获取不到PUT方式提交的参数的问题

本文介绍了一种在SpringBoot项目中解决PUT请求参数无法通过@NotBlank验证的问题的方法。通过在WebMvcConfig中添加HttpPutFormContentFilter Bean,可以正确解析PUT请求中的表单数据。

最近开发的项目中,使用了采用put方式更新数据记录,但是当和前端结合时,发现无法通过@NotBlank的验证器验证。一开始以为是前端同学的参数名称设置的不对,但是查阅资料后发现是SpringBoot配置有些问题。下面是详述。


一、问题名称:SpringBoot获取PUT方式提交参数为空

二、开发环境:SpringBoot 1.5.7 + Vue.js 2

三、解决方法:在WebMvcConfig中添加一个@Bean

1.修改配置:

@Configuration
@EnableWebMvc
public class WebMvcConfig extends WebMvcConfigurerAdapter {

    // 就是这个
    @Bean
    public HttpPutFormContentFilter httpPutFormContentFilter() {
        return new HttpPutFormContentFilter();
    }


}

2.使用时:

@RequestMapping(method = RequestMethod.PUT)
public ResponseEntity update(@Validated PutForm putForm){    /*Your Code Here*/   }
问题解决。



在 Spring Boot 的 Controller 层中,接收多个参数方式主要有以下几种形式,适用于不同的 HTTP 请求类型和数据传递方式。 ### 接收 URL 查询参数(Query Parameters) 当需要从 GET 请求的 URL 中提取多个查询参数时,可以使用 `@RequestParam` 注解。每个参数都需显式声明,并通过名称进行绑定。 ```java @GetMapping("/search") public String search(@RequestParam String keyword, @RequestParam int page) { return "Keyword: " + keyword + ", Page: " + page; } ``` 例如,发送请求 `/search?keyword=java&page=2`,会接收到 `keyword="java"` 和 `page=2`。此方法适用于 GET 请求中常见的分页、搜索等场景[^1]。 --- ### 接收路径变量(Path Variables) 对于 RESTful 风格的 URL 设计,可以通过 `@PathVariable` 获取路径中的多个变量值。 ```java @GetMapping("/users/{id}/roles/{roleId}") public String getUserRole(@PathVariable String id, @PathVariable String roleId) { return "User ID: " + id + ", Role ID: " + roleId; } ``` 例如,访问 `/users/123/roles/admin` 时,`id` 为 `"123"`,`roleId` 为 `"admin"`。这种方式常用于资源定位与层级结构表示[^1]。 --- ### 接收请求体中的 JSON 数据(POST/PUT) 在 POST 或 PUT 请求中,通常使用 `@RequestBody` 将 JSON 格式的请求体自动反序列化为 Java 对象。若需接收多个字段参数,可直接定义一个实体类或 Map。 #### 实体类示例 ```java @PostMapping("/user") public ResponseEntity<String> createUser(@RequestBody User user) { return ResponseEntity.ok("Name: " + user.getName() + ", Age: " + user.getAge()); } ``` 前端发送: ```json { "name": "John", "age": 25 } ``` #### Map 示例(适用于动态字段) ```java @PostMapping("/data") public ResponseEntity<String> receiveData(@RequestBody Map<String, Object> payload) { return ResponseEntity.ok("Received: " + payload); } ``` 前端发送: ```json { "key1": "value1", "key2": 123 } ``` 这种方式适合字段不固定或临时调试的场景。 --- ### 同时接收 URL 参数与请求体 如果一个接口需要同时接收路径变量、查询参数以及请求体中的数据,可以组合使用 `@PathVariable`、`@RequestParam` 和 `@RequestBody`。 ```java @PostMapping("/users/{id}") public ResponseEntity<String> updateUser( @PathVariable String id, @RequestParam String action, @RequestBody User user) { return ResponseEntity.ok("ID: " + id + ", Action: " + action + ", User: " + user.toString()); } ``` 例如,请求 `/users/456?action=update` 并携带 JSON 主体,将分别获取路径参数、查询参数和请求体内容。 --- ### 表单数据(Form Data)处理 对于 HTML 表单提交的数据,Spring Boot 可以通过 `@RequestParam` 接收多个字段,或者将它们封装到对象中。 ```java @PostMapping("/submit") public String submitForm( @RequestParam String username, @RequestParam String email) { return "Username: " + username + ", Email: " + email; } ``` 也可以使用对象封装: ```java public class FormData { private String username; private String email; // Getters and setters } @PostMapping("/submit") public String submitForm(@ModelAttribute FormData formData) { return "Username: " + formData.getUsername() + ", Email: " + formData.getEmail(); } ``` --- ### 总结 - **GET 请求**:使用 `@RequestParam` 或 `@PathVariable` 接收多个参数。 - **POST/PUT 请求**:使用 `@RequestBody` 接收 JSON 数据,或用 `@RequestParam` 处理表单数据。 - **混合场景**:可结合 `@PathVariable`、`@RequestParam` 和 `@RequestBody` 同时接收多种来源的参数。 ---
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值