摘要

项目是微服务架构,其中模块居多,但是我在跑其中一个模块时,发现无法查看 swagger 文档。由此进行了一系列排查。

正文

本文项目源码,Swagger2 访问路径 /v2/api-docs,路径源于 springfox.documentation.swagger2.web.Swagger2ControllerWebMvc#SWAGGER2_SPECIFICATION_PATH

一、项目 Build 出现 OOM

Java 项目 rebuild / run 时,提示 OutOfMemory。原因是 Java 项目过于臃肿了。

解决办法是File > Settings > Build,Execution,Deployment > Compiler,调大 Shared build process heap size(Mbytes) 的数值。

二、Swagger 404 但是一会又好了

已经确定 swagger 的配置没有问题,但是启动后访问 /v2/api-docs,居然提示 Unable to find specification for group

根据断点排查得知,swagger 的启动流程是这样的 启动容器 > 扫描文档并追加到文档缓存,如果项目本身特别臃肿的时候,就会出现类似,项目启动成功,但是访问 swagger 反而是 404。

三、Swagger2 空指针 Unable to scan documentation context default

微服务模块有很多,但是其中一个微服务的 swagger 居然打不开。日志如下

我排查问题的步骤如下

  1. 针对性的开启 debug 日志,参考
  2. 添加 NullPointerException 异常断点,参考
  3. 跟踪堆栈

跟踪堆栈 springfox.documentation.spring.web.readers.operation.OperationParameterReader#apply,发现怎么变量还重复了,排查一下 model,发现是修饰符设置成了 public 导致的,设置为 private 即可解决

为啥设置成 public 就会导致 NullPointerException 呢?继续排查。

只有两个变量,但是 swagger 居然识别出来了三个,public 变量是重复的。

排查发现,swagger 在构建文档时,处理字段的逻辑是 public getter 方法public 变量public Integer getAge()public Integer age 就会被识别成两个变量了,但本质上只是一个。

所以在写代码时,还是要规范一点才行。

工作中的屎山项目,又让我长见识了。这是我自己写代码时,从来不会触及到的问题。