Spring GET请求传参报错400:MissingServletRequestParameterException排查
问题根源
GET 请求的 HTTP 规范中,参数应通过URL查询参数(?key=value形式)传递,而非请求体(JSON)。Spring MVC 的@RequestParam注解默认从查询参数、表单参数中取值,不会解析请求体内的 JSON 数据。你用 Postman 将参数放在 JSON 请求体里发送 GET 请求,Spring 找不到对应的参数,因此抛出MissingServletRequestParameterException。
解决方案
1. 遵循GET规范传递参数(推荐)
将uniqueConfig和commitHash作为查询参数拼在 URL 后,示例:http://your-domain/statsUnique?uniqueConfig=xxx&commitHash=yyy
在 Postman 中选择 GET 方法,切换到「Params」标签页添加这两个键值对,无需填写请求体。
对应 Controller 代码(假设你原本的写法如下):
@GetMapping("/statsUnique") public ResponseEntity<?> getStats(@RequestParam String uniqueConfig, @RequestParam String commitHash) { // 业务逻辑实现 return ResponseEntity.ok(...); }
2. 特殊场景下用请求体传GET参数(不推荐)
若因特殊需求必须用请求体传递 GET 参数,可改用@RequestBody接收,但需注意:部分 HTTP 客户端或服务器可能不支持 GET 请求带请求体,且不符合 HTTP 设计原则。
调整后的 Controller 代码:
// 定义参数实体类 public class StatsRequest { private String uniqueConfig; private String commitHash; // 生成 getter、setter 方法 } // Controller 接口 @GetMapping("/statsUnique") public ResponseEntity<?> getStats(@RequestBody StatsRequest request) { String uniqueConfig = request.getUniqueConfig(); String commitHash = request.getCommitHash(); // 业务逻辑实现 return ResponseEntity.ok(...); }
3. 改用POST请求(适合复杂参数场景)
如果参数结构复杂或更适合放在请求体中,直接将接口改为 POST 方法:
@PostMapping("/statsUnique") public ResponseEntity<?> getStats(@RequestBody StatsRequest request) { // 业务逻辑实现 return ResponseEntity.ok(...); }
Postman 中选择 POST 方法,切换到「Body」标签页,选择「raw」并设置格式为 JSON,传入参数:
{ "uniqueConfig": "xxx", "commitHash": "yyy" }
内容的提问来源于stack exchange,提问作者arthurIsVibing
相关产品推荐
相关产品推荐

