Spring Boot控制器接收JSON数组POST请求无响应问题排查
问题分析与解决方案
核心问题排查方向
请求无响应且无日志输出,说明请求未成功到达控制器方法,或请求体解析阶段出现异常但未被捕获记录,以下是具体排查和解决步骤:
1. 确认请求头配置正确
Spring Boot解析JSON请求体依赖Content-Type: application/json请求头,如果客户端未设置该头,Spring会无法解析请求体,直接拦截请求且无明确反馈。
- 使用Postman/curl测试时,必须手动添加该请求头
- 示例curl命令:
curl -X POST \ http://localhost:8080/justATest \ -H 'Content-Type: application/json' \ -d '[ { "artifact_id": 10, "session_id":45, "user_id": "user99" } ]'
2. 开启DEBUG日志定位问题
默认日志级别可能无法记录请求解析的细节,修改application.properties或application.yml开启Web层DEBUG日志:
# 开启Spring Web模块调试日志 logging.level.org.springframework.web=DEBUG # 开启你的控制器所在包的调试日志 logging.level.com.your.package=DEBUG
启动服务后重新发送请求,查看日志中是否有以下关键信息:
- 请求是否到达
/justATest路径 - 有没有
HttpMessageNotReadableException等请求体解析异常
3. 简化控制器验证请求通路
暂时注释服务调用,仅保留基础输出和返回,验证请求是否能到达控制器:
@RestController public class EsearchTestController { @CrossOrigin @PostMapping("/justATest") public String testController(@RequestBody List<ESearchResponse> responseList){ System.out.println("请求到达,接收列表大小:" + responseList.size()); return "请求接收成功,列表大小:" + responseList.size(); } }
如果此时仍无输出,说明请求路径错误(比如配置了server.servlet.context-path导致路径前缀变化),或跨域预检请求失败。
4. 确认实体类序列化/反序列化正常
虽然使用了Lombok的@Data注解,但需确保其正确生成了字段的getter/setter:
- 可以临时移除
@Data,手动编写所有字段的getter/setter测试 - 检查实体类字段名与JSON字段是否完全匹配(当前
artifact_id、session_id、user_id均匹配,无问题) - 注意
primary_key是自增主键,JSON中无需传递,@GeneratedValue会自动生成,此配置正常
5. 排查全局异常处理器
如果项目中有@ControllerAdvice实现的全局异常处理器,需检查是否拦截了请求体解析异常且未输出日志或返回响应。例如:
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(HttpMessageNotReadableException.class) public ResponseEntity<String> handleParseError(HttpMessageNotReadableException e) { // 需添加日志记录 log.error("请求体解析失败:", e); return ResponseEntity.badRequest().body("请求格式错误:" + e.getMessage()); } }
总结
优先检查请求头和日志配置,定位请求是否到达控制器或解析阶段出错,再逐步排查实体类和异常处理逻辑。
内容的提问来源于stack exchange,提问作者FishOnAComputer
相关产品推荐
相关产品推荐

