傳統 Swagger 需在代碼中添加大量註解,侵入性強且易與實際接口脫節。Spring RestDocs 採用「測試驅動文檔」:通過 JUnit + MockMvc 執行真實請求,自動產生請求/響應片段,再由 Asciidoctor 渲染為 HTML。優勢在於:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.restdocs</groupId>
<artifactId>spring-restdocs-mockmvc</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
@RestController
public class HomeController {
@GetMapping("/")
public Map<String, Object> greeting() {
return Collections.singletonMap("message", "Hello World");
}
}
@RunWith(SpringRunner.class)
@WebMvcTest(HomeController.class)
@AutoConfigureRestDocs(outputDir = "target/snippets")
public class WebLayerTest {
@Autowired private MockMvc mockMvc;
@Test
public void shouldReturnDefaultMessage() throws Exception {
this.mockMvc.perform(get("/"))
.andDo(print())
.andExpect(status().isOk())
.andExpect(content().string(containsString("Hello World")))
.andDo(document("home")); // 關鍵:生成 home 片段
}
}
運行測試,target/snippets/home/ 下將生成:
http-request.adoc / http-response.adoccurl-request.adoc / httpie-request.adoc創建 src/main/asciidoc/index.adoc:
= 用 Spring REST Docs 構建文檔
This is an example output for a service running at https://localhost:8080:
== Request
include::{snippets}/home/http-request.adoc[]
== Response
include::{snippets}/home/http-response.adoc[]
<plugin>
<groupId>org.asciidoctor</groupId>
<artifactId>asciidoctor-maven-plugin</artifactId>
<executions>
<execution>
<id>generate-docs</id>
<phase>prepare-package</phase>
<goals><goal>process-asciidoc</goal></goals>
<configuration>
<sourceDocumentName>index.adoc</sourceDocumentName>
<backend>html</backend>
<attributes>
<snippets>${project.build.directory}/snippets</snippets>
</attributes>
</configuration>
</execution>
</executions>
</plugin>
mvnw package
輸出位於 target/generated-docs/index.html,界面簡潔、結構清晰,可直接部署發布。
fieldWithPath() 記錄請求/響應字段含義tag() 將相關接口歸類Spring RestDocs 以測試為單一事實來源,讓 API 文檔永不失真。幾分鐘接入,長期受益——強烈推薦給追求工程質量的團隊。