需求:项目使用spring boot,maven工程,需要使用swagger生成接口文档,格式为html。
在网上查了一些资料,大部分是使用swagger-ui,在线文档,不符合要求;小部分提到了离线文档生成,但是总觉得有点绕,结合实际的使用经验,输出总结一篇,供参考。
本文使用常见的生成流程,swagger json -> asciidoc -> html,下面说明使用过程的几个关键点。
生成swagger json,需要曲线救国一下,要在单元测试中调用生成函数生成。
@WebAppConfiguration
@RunWith(SpringJUnit4ClassRunner.class)
//Application.class需要替换为你的工程中的applicaton类
//SwaggerConfig为swagger配置信息,详情如下
@SpringApplicationConfiguration(classes = {Application.class, SwaggerConfig.class})
public class Swagger2MarkupTest {
@Autowired
private WebApplicationContext context;
private MockMvc mockMvc;
@Before
public void setUp() {
this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context).build();
}
@Test
public void convertSwaggerToAsciiDoc() throws Exception {
this.mockMvc.perform(get("/v2/api-docs")
.accept(MediaType.APPLICATION_JSON))
.andDo(Swagger2MarkupResultHandler
.outputDirectory("src/docs/asciidoc/generated").build())
.andExpect(status().isOk());
}
}
SwaggerConfig类主要配置需要扫描的接口信息,也放在单元测试的目录下。
@Configuration
@EnableSwagger2
public class SwaggerConfig {
/**
* 创建API应用
* apiInfo() 增加API相关信息
* 通过select()函数返回一个ApiSelectorBuilder实例,用来控制哪些接口暴露给Swagger来展现
*
*/
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
//package包名替换为你的工程中需要扫描的接口的包名
.apis(RequestHandlerSelectors.basePackage("*.*.*.controller"))
.paths(PathSelectors.any())
.build();
}
/**
* 创建该API的基本信息(这些基本信息会展现在文档页面中)
*/
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("XX在线接口文档")
.version("1.0")
.build();
}
}
这一步依赖的jar包如下:
io.swagger
swagger-annotations
1.5.19
io.springfox
springfox-swagger2
2.7.0
test
org.springframework.restdocs
spring-restdocs-mockmvc
1.1.2.RELEASE
test
完成上述这几步,运行测试,就会生成对应的swagger json文件。
该步骤主要使用swagger2markup-maven-plugin来生成(gradle工程有对应的gradle plugin),pom配置如下:
io.github.swagger2markup
swagger2markup-maven-plugin
${swagger2markup.plugin.version}
io.github.swagger2markup
swagger2markup-import-files-ext
${swagger2markup.extension.version}
io.github.swagger2markup
swagger2markup
${swagger2markup.version}
${swagger.input}
${generated.asciidoc.directory}
ASCIIDOC
TAGS
${project.basedir}/src/docs/asciidoc/extensions/overview
${project.basedir}/src/docs/asciidoc/extensions/definitions
${project.basedir}/src/docs/asciidoc/extensions/paths
${project.basedir}src/docs/asciidoc/extensions/security
generate-sources
convertSwagger2markup
相关配置信息:
1.3.1
1.3.3
1.3.1
1.5.5
1.5.0-alpha.15
9.1.8.0
${project.basedir}/src/docs/asciidoc/generated/XXXX.json
${project.basedir}/src/docs/asciidoc
${project.build.directory}/asciidoc
${project.build.directory}/asciidoc/html
${project.build.directory}/asciidoc/pdf
该步骤使用assiidoc来将ascii doc文件转换为html或其它类型文件。
org.asciidoctor
asciidoctor-maven-plugin
1.5.5
org.asciidoctor
asciidoctorj-pdf
${asciidoctorj.pdf.version}
org.jruby
jruby-complete
${jruby.version}
org.asciidoctor
asciidoctorj
${asciidoctorj.version}
${asciidoctor.input.directory}
index.adoc
book
left
3
${generated.asciidoc.directory}
output-html
generate-resources
process-asciidoc
html5
${asciidoctor.html.output.directory}
output-pdf
generate-resources
process-asciidoc
pdf
${asciidoctor.pdf.output.directory}
index.adoc的内容:
include::{generated}/overview.adoc[]
include::{generated}/security.adoc[]
include::{generated}/paths.adoc[]
include::{generated}/definitions.adoc[]
ok,完成这三个步骤,运行mnv install命令,就可以生成出像样的接口文档了。
在实际使用中,可以将文件转换的工作当做一个单独的工程,swager json文件生成只作为单元测试代码存在,这样整个工程真正需要打进jar包的只有swagger-annotations,对现有代码影响较小,功能也很独立。
参考文档:
[1] 从代码中生成接口文档的完整过程–Gradle工程实例
[2] 将Swagger文件转换为html文件的maven工程示例
[3] Swagger2Markup官方文档
[4] Swagger2离线文档:PDF和Html5格式
[6] Swagger+spring boot 转换为html,PDF文件等