swagger2.0在生成接口文档的时候,如果接口中的对象包含嵌入或者复合主键,则会引起java.lang.StackOverflowError: null异常,只需要在controller层的方法上加上@ApiIgnore注解即可。但是这样的话方法就无法显示了。
所以如下解决:
集成swagger-ui时,在项目启动的时候,如果接口参数的属性出现嵌套,就会出现无限递归,进而导致StackOverFlowError,如下图:
原因在于swagger在读取参数的时候,如果发现参数的属性也是一个对象时会继续进行展开,代码如下:
由此就可能出现我遇到的这种情况:(笑哭)
就这样没玩没了的展开,直到内存爆炸~~~
那怎么解决呢?
在网上找资料的时候看到这么一篇文章:
springfox-swagger 参数是对象无限递归解决方案
作者的解决方案是把递归展开的代码注释掉,不过我觉得不妥,一是因为注释掉,会影响非嵌套对象的正常展开,而是还需要把注释后的类替换掉原来内置的类,操作上会比较麻烦。
回过头来再看看代码,发现有这么一段:
这段的意思就是按照设定的转换规则把部分类型转换成指定的类型,然后在筛选需要展开的类型中过滤掉这些类,可以看到代码中已经内置了14个转换规则,我猜测可能就是把会出现递归的对象给处理掉(没有具体看),毕竟java原生的很多类也可能是嵌套的吧。既然如此,那是不是可以把我们代码中出现的嵌套对象也添加到这些规则中呢,哈哈,那是必须的啊,如下:
重启服务,可以了。
网友评论