Spring Boot 2集成Springfox Swagger2 2.8.0启动StackOverflowError问题排查
Spring Boot 2 + Springfox Swagger2 2.8.0 启动StackOverflowError问题解析
问题原因
从你贴出的报错堆栈能明显看到,ModelAttributeParameterExpander.expand()方法一直在递归调用,最终触发了StackOverflowError。这通常有两个核心诱因:
- 实体类/DTO存在循环引用:比如你的User对象里包含Order列表,而Order对象又反向引用了User,Springfox 2.8.0在解析这类双向依赖的模型时,无法自动终止递归,导致栈空间被耗尽。
- 版本兼容性问题:Springfox 2.8.0发布时,Spring Boot 2还处于早期预览版,两者的适配存在一些细节缺陷,会放大循环引用引发的递归问题。
解决办法
我整理了几个实用的解决方案,你可以根据自己的项目情况选择:
排除循环引用字段:在引发循环依赖的字段上添加Swagger的隐藏注解,让解析器跳过该字段。如果同时用Jackson做序列化,也可以搭配
@JsonIgnore:public class Order { // 隐藏这个会触发递归的User引用 @ApiModelProperty(hidden = true) private User user; // 其他业务字段... }升级Springfox到兼容版本:Springfox 2.9.2是对Spring Boot 2.x兼容性较好的版本,升级后能自动处理大部分循环引用的递归问题。修改你的依赖配置:
Maven示例:<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> </dependency>自定义Swagger递归深度限制:如果不想修改实体或升级版本,可以通过配置强制限制模型解析的递归深度,避免无限递归:
@Configuration @EnableSwagger2 public class SwaggerConfig { @Bean public Docket api() { return new Docket(DocumentationType.SWAGGER_2) .select() .apis(RequestHandlerSelectors.basePackage("com.decisionwanted.api")) .paths(PathSelectors.any()) .build() .models(new DefaultModelProvider( new DefaultModelSpecificationBuilders(), new ModelResolver( new TypeNameProvider(), new JacksonModuleRegistrar(), new DefaultModelConverter(), 2 // 设置递归深度为2,根据你的实体结构调整 ) )); } }
内容的提问来源于stack exchange,提问作者alexanoid
相关产品推荐
相关产品推荐

