Spring Boot 3 @GetMapping接口为何需设置content-length:0才能正常响应?
问题描述
使用spring-boot-starter-parent:3.0.2搭建的Spring Boot 3项目中,@RestController下的@GetMapping接口出现异常:仅当请求头包含content-length:0时能正常响应,否则返回HTTP 400「错误请求」。
- Spring RestTemplate编写的集成测试可正常调用,因为RestTemplate会自动添加该请求头;
- JMeter测试时报错,因GET请求未携带Content-Length头,而这符合RFC 9110规范:「当请求无内容且方法语义不期望数据时,用户代理不应发送Content-Length头」。
初始代码:
@RestController @RequestMapping("/v1/myService") @Component @Slf4j class GetServlet { @GetMapping(value = "/greeting", produces = "text/plain") public ResponseEntity getGreeting() { log.debug("Sending greeting"); return ResponseEntity.ok("Hello world!"); } }
移除produces参数后问题依旧:
@RestController @RequestMapping("/v1/myService") @Component @Slf4j class GetServlet { @GetMapping(value = "/greeting") public ResponseEntity getGreeting() { log.debug("Sending greeting"); return ResponseEntity.ok() .contentType(MediaType.valueOf("text/plain")) .body("Hello world!"); } }
可能的触发原因
- Servlet容器的严格校验配置:Spring Boot 3默认使用Tomcat 10.1.x,若容器开启了严格的请求头解析规则(如
strictHeaderParsing=true),或存在请求体校验逻辑误判,可能将无Content-Length的GET请求判定为非法。 - 自定义拦截器/过滤器的错误处理:项目中自定义的拦截器、过滤器可能未区分HTTP方法语义,强制要求所有请求携带Content-Length头,导致无请求体的GET请求被拦截返回400。
- Spring MVC的内容协商或请求匹配冲突:全局内容协商配置、或其他
@RequestMapping的consumes属性设置,可能让Spring MVC错误期望GET请求携带内容,从而拒绝无Content-Length的请求。 - 依赖版本的特定Bug:
spring-boot-starter-parent:3.0.2对应的Spring MVC或Tomcat版本可能存在特定Bug,导致对无Content-Length的GET请求处理异常。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

