集成swagger-ui时参数对象嵌套无限递归导致StackOverFlowError的处理办法

集成swagger-ui时,在项目启动的时候,如果接口参数的属性出现嵌套,就会出现无限递归,进而导致StackOverFlowError,如下图:
这里写图片描述

原因在于swagger在读取参数的时候,如果发现参数的属性也是一个对象时会继续进行展开,代码如下:
集成swagger-ui时参数对象嵌套无限递归导致StackOverFlowError的处理办法_第1张图片
由此就可能出现我遇到的这种情况:(笑哭)
集成swagger-ui时参数对象嵌套无限递归导致StackOverFlowError的处理办法_第2张图片
就这样没玩没了的展开,直到内存爆炸~~~

那怎么解决呢?
在网上找资料的时候看到这么一篇文章:
springfox-swagger 参数是对象无限递归解决方案
作者的解决方案是把递归展开的代码注释掉,不过我觉得不妥,一是因为注释掉,会影响非嵌套对象的正常展开,而是还需要把注释后的类替换掉原来内置的类,操作上会比较麻烦。
回过头来再看看代码,发现有这么一段:
集成swagger-ui时参数对象嵌套无限递归导致StackOverFlowError的处理办法_第3张图片

这段的意思就是按照设定的转换规则把部分类型转换成指定的类型,然后在筛选需要展开的类型中过滤掉这些类,可以看到代码中已经内置了14个转换规则,我猜测可能就是把会出现递归的对象给处理掉(没有具体看),毕竟java原生的很多类也可能是嵌套的吧。既然如此,那是不是可以把我们代码中出现的嵌套对象也添加到这些规则中呢,哈哈,那是必须的啊,如下:
集成swagger-ui时参数对象嵌套无限递归导致StackOverFlowError的处理办法_第4张图片

重启服务,可以了。

你可能感兴趣的:(web开发)