有时候给接口文档的时候不能直接给个URL,这可能因为没部署上服务器,亦或是内网的限制.
这时对方需要一个HTML或者是个PDF静态文档,本来想着在swagger网址那里Ctrl+S保存下来发过去就行了,结果这样保存的文档根本不能看.
调研后发现,可以通过springfox-staticdocs组件生成swagger静态文件,然后通过maven组件根据静态文件生成HTML和PDF.
以之前的swagger示例项目来展示.
swagger接入请看 withing
首先添加dependency依赖
<properties>
<swagger.version>2.6.1swagger.version>
<start-class>com.f6car.base.Applicationstart-class>
<snippetsDirectory>${project.build.directory}/generated-snippetssnippetsDirectory>
<asciidoctor.input.directory>${project.basedir}/docs/asciidocasciidoctor.input.directory>
<generated.asciidoc.directory>${project.build.directory}/asciidocgenerated.asciidoc.directory>
<asciidoctor.html.output.directory>${project.build.directory}/asciidoc/htmlasciidoctor.html.output.directory>
<asciidoctor.pdf.output.directory>${project.build.directory}/asciidoc/pdfasciidoctor.pdf.output.directory>
properties>
<dependency>
<groupId>io.springfoxgroupId>
<artifactId>springfox-staticdocsartifactId>
<version>${swagger.version}version>
<scope>testscope>
dependency>
<dependency>
<groupId>org.springframework.restdocsgroupId>
<artifactId>spring-restdocs-mockmvcartifactId>
<scope>testscope>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-testartifactId>
<version>2.0.0.RELEASEversion>
<scope>testscope>
dependency>
这里有个坑要注意: swagger.version换成2.6.1了,这是因为springfox-staticdocs这个组件只支持到2.6.1,但不能将其他两个swagger2和swagger-ui版本换成2.8.x或2.7.x,因为springfox-staticdocs生成文档时会调用以前版本的某个函数,更换成新版本会抛出MethodNotFoundException
@RunWith(SpringRunner.class)
@SpringBootTest
public class SwaggerStaticDocTest {
@Autowired
private WebApplicationContext context;
private String snippetDir = "target/generated-snippets";
private String outputDir = "target/asciidoc";
private MockMvc mockMvc;
@Before
public void setUp() {
this.mockMvc = MockMvcBuilders.webAppContextSetup(this.context).build();
}
@Test
public void Test() throws Exception {
mockMvc.perform(get("/v2/api-docs").accept(MediaType.APPLICATION_JSON))
.andDo(SwaggerResultHandler.outputDirectory(outputDir).build())
.andExpect(status().isOk())
.andReturn();
Swagger2MarkupConverter.from(outputDir + "/swagger.json")
.withMarkupLanguage(MarkupLanguage.ASCIIDOC)
.withExamples(snippetDir)
.build()
.intoFolder(outputDir);
}
}
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<version>3.1version>
<configuration>
<source>1.8source>
<target>1.8target>
configuration>
plugin>
<plugin>
<groupId>org.asciidoctorgroupId>
<artifactId>asciidoctor-maven-pluginartifactId>
<version>1.5.3version>
<dependencies>
<dependency>
<groupId>org.asciidoctorgroupId>
<artifactId>asciidoctorj-pdfartifactId>
<version>1.5.0-alpha.14version>
dependency>
<dependency>
<groupId>org.jrubygroupId>
<artifactId>jruby-completeartifactId>
<version>1.7.21version>
dependency>
dependencies>
<configuration>
<sourceDirectory>${asciidoctor.input.directory}sourceDirectory>
<sourceDocumentName>index.adocsourceDocumentName>
<attributes>
<doctype>bookdoctype>
<toc>lefttoc>
<toclevels>3toclevels>
<numbered>numbered>
<hardbreaks>hardbreaks>
<sectlinks>sectlinks>
<sectanchors>sectanchors>
<generated>${generated.asciidoc.directory}generated>
attributes>
configuration>
<executions>
<execution>
<id>output-htmlid>
<phase>testphase>
<goals>
<goal>process-asciidocgoal>
goals>
<configuration>
<backend>html5backend>
<outputDirectory>${asciidoctor.html.output.directory}outputDirectory>
configuration>
execution>
<execution>
<id>output-pdfid>
<phase>testphase>
<goals>
<goal>process-asciidocgoal>
goals>
<configuration>
<backend>pdfbackend>
<outputDirectory>${asciidoctor.pdf.output.directory}outputDirectory>
configuration>
execution>
executions>
plugin>
plugins>
<finalName>${parent.artifactId}finalName>
build>
在根目录中添加docs
include::{generated}/overview.adoc[]
include::{generated}/definitions.adoc[]
include::{generated}/paths.adoc[]
目录结构如下:
运行完后可在target里找到所需的静态文档
这样的生成方式,pdf的中文显示会不正确,主要原因时使用的默认字体对中文支持不好,可以手动替换字体,但需谨慎,因为字体会随系统不同有差异,导致根本运行不了,这根据个人需求来抉择.字体可以自行替换,能正常使用即可.
<build>
<plugins>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-compiler-pluginartifactId>
<version>3.1version>
<configuration>
<source>1.8source>
<target>1.8target>
configuration>
plugin>
<plugin>
<groupId>org.asciidoctorgroupId>
<artifactId>asciidoctor-maven-pluginartifactId>
<version>1.5.3version>
<dependencies>
<dependency>
<groupId>org.asciidoctorgroupId>
<artifactId>asciidoctorj-pdfartifactId>
<version>1.5.0-alpha.14version>
dependency>
<dependency>
<groupId>org.jrubygroupId>
<artifactId>jruby-completeartifactId>
<version>1.7.21version>
dependency>
dependencies>
<configuration>
<sourceDirectory>${asciidoctor.input.directory}sourceDirectory>
<sourceDocumentName>index.adocsourceDocumentName>
<attributes>
<doctype>bookdoctype>
<toc>lefttoc>
<toclevels>3toclevels>
<numbered>numbered>
<hardbreaks>hardbreaks>
<sectlinks>sectlinks>
<sectanchors>sectanchors>
<generated>${generated.asciidoc.directory}generated>
<pdf-fontsdir>fontspdf-fontsdir>
<pdf-stylesdir>themespdf-stylesdir>
<pdf-style>cnpdf-style>
attributes>
configuration>
<executions>
<execution>
<id>output-htmlid>
<phase>testphase>
<goals>
<goal>process-asciidocgoal>
goals>
<configuration>
<backend>html5backend>
<outputDirectory>${asciidoctor.html.output.directory}outputDirectory>
configuration>
execution>
<execution>
<id>output-pdfid>
<phase>testphase>
<goals>
<goal>process-asciidocgoal>
goals>
<configuration>
<backend>pdfbackend>
<outputDirectory>${asciidoctor.pdf.output.directory}outputDirectory>
configuration>
execution>
executions>
plugin>
plugins>
<finalName>${parent.artifactId}finalName>
build>
主要差别在这
<pdf-fontsdir>fontspdf-fontsdir>
<pdf-stylesdir>themespdf-stylesdir>
<pdf-style>cnpdf-style>
这样生成的PDF文件就没问题了.
项目github: withing
pdf解决方法在dev分支.