在以前的项目中使用 Word 编写 API 文档,便于在项目成员之间传播和离线阅读,但是这种方式十分落后,有很多不足,例如以下:
1. API 数量较多时,维护和阅读困难
2. 修改 API 时,需修改者维护版本修改记录
3. API 特殊的数据格式如 json,使用 Word 编写困难
在后来某个项目中同事使用了 Swagger 编写 API 文档。Swagger 是一个 API 文档自动生成框架,能够通过反射读取后端代码注解定义的 API 文档,减少了文档编写工作的工作量。但是好像并不支持离线阅读,而且一定程度上会造成代码污染。
再后来开始使用一款开源的 API 文档管理工具 [小幺鸡](http://www.xiaoyaoji.cn/) ,该工具不仅可以生成离线文档,还可以在开发成员之间分享,协同编辑,使用十分方便。
但是使用 Swagger 编写文档已经作为习惯保留下来。由于一直没有深入去研究这款文档生成框架,在最近的项目使用过程中出现了异常,现在先记录下来。
-
首先在 pom.xml 文件中添加 maven 依赖:
<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.6.1</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.6.1</version> </dependency>
-
编写员工和部门实体类:
import lombok.Data; /** * @author smileorsilence * @date 2018/11/28 */ @Data public class Employee { private String name; private Department department; } import lombok.Data; import java.util.Set; /** * @author smileorsilence * @date 2018/11/28 */ @Data public class Department { private Set<Employee> employees; }
-
然后编写企业 DTO 类并使用框架提供的注解:
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * @author smileorsilence * @date 2018/11/28 */ @ApiModel("企业") @Data public class CompanyDTO { @ApiModelProperty("员工") private Employee employee; }
-
接着编写企业控制类并使用框架提供的注解:
import com.mj.wcs.service.dto.user.CompanyDTO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; /** * @author smileorsilence * @date 2018/11/28 */ @Api("企业控制器") @Slf4j @Controller @RequestMapping("/api") public class CompanyController { @ApiOperation(value = "添加企业") @PostMapping(value = "/company") @ResponseBody public String createCompany(CompanyDTO company) { return "smileorsilence"; } }
-
此时运行程序会抛出内存溢出异常:
2018-11-28 15:59:45.649 ERROR 5192 --- [ main] o.s.boot.SpringApplication : Application startup failed org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is com.google.common.util.concurrent.ExecutionError: java.lang.StackOverflowError at org.springframework.context.support.DefaultLifecycleProcessor.doStart(DefaultLifecycleProcessor.java:178) at org.springframework.context.support.DefaultLifecycleProcessor.access$200(DefaultLifecycleProcessor.java:50) at org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:348) ... at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118) at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107) at com.mj.wcs.WCSApplication.main(WCSApplication.java:30) Caused by: com.google.common.util.concurrent.ExecutionError: java.lang.StackOverflowError at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2201) at com.google.common.cache.LocalCache.get(LocalCache.java:3937) at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3941) ... Caused by: java.lang.StackOverflowError: null at com.google.common.collect.Iterables.any(Iterables.java:623) at springfox.documentation.schema.WildcardType.hasWildcards(WildcardType.java:42) at springfox.documentation.schema.WildcardType$1.apply(WildcardType.java:83) ... at com.google.common.collect.Iterators$7.computeNext(Iterators.java:650) at com.google.common.collect.AbstractIterator.tryToComputeNext(AbstractIterator.java:143) at com.google.common.collect.AbstractIterator.hasNext(AbstractIterator.java:138) at springfox.documentation.spring.web.readers.parameter.ModelAttributeParameterExpander.expand(ModelAttributeParameterExpander.java:91) at springfox.documentation.spring.web.readers.parameter.ModelAttributeParameterExpander.expand(ModelAttributeParameterExpander.java:110) at springfox.documentation.spring.web.readers.parameter.ModelAttributeParameterExpander.expand(ModelAttributeParameterExpander.java:94) at springfox.documentation.spring.web.readers.parameter.ModelAttributeParameterExpander.expand(ModelAttributeParameterExpander.java:110) at springfox.documentation.spring.web.readers.parameter.ModelAttributeParameterExpander.expand(ModelAttributeParameterExpander.java:94) ...
源码地址:
参考文章: