Springfox Swagger2 2.9.2下POST接口@RequestBody传JPA实体时启动失败、Swagger不识别Controller
Springfox 2.9.2 结合带关联映射JPA实体启动异常修复
问题根因
Springfox 2.9.2的模型解析模块存在无限制递归遍历实体字段的逻辑缺陷:扫描@RequestBody修饰的入参类型时,会顺着字段类型无限向下解析。当入参JPA实体包含@ManyToOne、@OneToOne这类跨表关联映射时,很容易触发双向关联的循环递归,最终导致栈溢出。
由于该模块的异常捕获逻辑未将栈溢出的原始异常抛出到控制台,会直接造成应用线程阻塞,表现为Tomcat未完成初始化、启动流程无明确报错中断、Swagger无法识别新增Controller。
已验证的复现逻辑
- 仅定义无复杂入参的GET接口时,Swagger可正常加载、识别接口,无任何异常
- 新增带@RequestBody修饰JPA实体的POST接口时,只要实体包含关联映射注解,就会触发启动失败
- 无关联映射的普通实体作为入参时,不会触发该问题
可落地修复方案
- 关联字段隐藏配置:在JPA实体的关联字段上添加
@ApiModelProperty(hidden = true)注解,告知Springfox跳过该字段的解析,不暴露关联类型的元数据 - 递归逻辑改造:自定义Springfox模型解析器的遍历逻辑,增加最大递归层级限制(一般设置为2-3层即可),避免无限递归深入关联表的实体结构
- 入参隔离适配:不直接将JPA持久化实体作为@RequestBody的入参类型,单独定义接口专用的请求DTO,DTO仅包含接口需要接收的字段,不携带任何JPA关联注解,从根源切断递归解析路径
- JVM参数兜底:若临时无法调整代码,可在启动脚本中调大线程栈大小,添加
-Xss2m参数缓解栈溢出问题,该方案仅作临时兜底,无法根治缺陷
注意:原有自定义Docket配置(扫描带@Api注解的类、匹配全路径、排除Gson自动装配、JPA审计、定时任务能力)不需要调整,调整后应用可正常完成Tomcat初始化,Swagger UI可正确识别所有接口。
内容的提问来源于stack exchange,提问作者Bhumika
相关产品推荐
相关产品推荐

