Spring Boot 整合 Swagger3 指南
Swagger 好早之前就更新到 3 了,不過一直沒空和小伙伴們分享下具體玩法,主要是也是因?yàn)?Swagger 雖然升級了,但是我們在 Spring Boot 中卻依然可以使用老版本的 Swagger,不過好像是從 Spring Boot2.6 開始,你會發(fā)現(xiàn)用不了老版本的 Swagger 了,哎,反正遲早都得搞,那不如就今天吧!
今天我們就來看看,在 Spring Boot2.7.1 中如何使用 Swagger3。
1. 依賴
首先我們創(chuàng)建一個(gè) Spring Boot 項(xiàng)目,引入 Swagger3 依賴,如下:
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
以前在 Swagger2 的時(shí)代,這個(gè)依賴我們需要引入兩個(gè),現(xiàn)在就只需要這一個(gè)即可。
2. 配置
接下來在啟動類上添加兩個(gè)注解,開啟 Swagger:
@SpringBootApplication
//開啟swagger
@EnableSwagger2
@EnableOpenApi
@EnableWebMvc
public class SwaggerDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SwaggerDemoApplication.class, args);
}
}
現(xiàn)在,基本工作就已經(jīng)完成了,此時(shí)即使我們不做任何額外的事情,Swagger 文檔也已經(jīng)可以自動生成了。
啟動項(xiàng)目,瀏覽器輸入 http://localhost:8080/swagger-ui/index.html 查看 Swagger 文檔。
小伙伴們需要注意,這個(gè)默認(rèn)的文檔訪問路徑跟以前的 Swagger2 不一樣哦!
現(xiàn)在掃描出來的接口中有一個(gè)是 BasicErrorController,這個(gè)是 Spring Boot 默認(rèn)提供的異常處理器,因?yàn)槲覀儸F(xiàn)在沒有為 Swagger 設(shè)置包掃描路徑,所以就連同這個(gè)一起被掃描出來了。
好了,現(xiàn)在我們可以對這個(gè)網(wǎng)頁稍微做一些定制,如下:
@Configuration
public class Swagger2Config {
@Bean
Docket docket() {
return new Docket(DocumentationType.OAS_30)
//配置網(wǎng)站的基本信息
.apiInfo(new ApiInfoBuilder()
//網(wǎng)站標(biāo)題
.title("TienChin項(xiàng)目在線接口文檔")
//標(biāo)題后面的版本號
.version("v1.0")
.description("TienChin項(xiàng)目接口文檔")
//聯(lián)系人信息
.contact(new Contact("javaboy", "http://www.javaboy.org", "111@qq.com"))
.build())
.select()
//指定接口的位置
.apis(RequestHandlerSelectors.basePackage("org.javaboy.swagger_demo.controller"))
.build();
}
}
這段配置基本上和之前的 Swagger2 的一致,配置完成后,Swagger 頁面的基本信息就會更新過來。
3. 接口配置
接下來就是一些具體的接口配置了。
這個(gè)和 Swagger2 也基本一致,而且很容易懂,下面我來分別向小伙伴們舉例說明:
@RestController
@Api(tags = "用戶管理相關(guān)接口")
@RequestMapping("/user")
public class UserController {
@PostMapping("/")
@ApiOperation("添加用戶的接口")
@ApiImplicitParams({
@ApiImplicitParam(name = "username", value = "用戶名", defaultValue = "李四"),
@ApiImplicitParam(name = "address", value = "用戶地址", defaultValue = "深圳", required = true)
})
public RespBean addUser(String username, @RequestParam(required = true) String address) {
return new RespBean();
}
@GetMapping("/")
@ApiOperation("根據(jù)id查詢用戶的接口")
@ApiImplicitParam(name = "id", value = "用戶id", defaultValue = "99", required = true)
public User getUserById(@PathVariable Integer id) {
User user = new User();
user.setId(id);
return user;
}
@PutMapping("/{id}")
@ApiOperation("根據(jù)id更新用戶的接口")
public User updateUserById(@RequestBody User user) {
return user;
}
}
這里邊涉及到多個(gè) API,我來向小伙伴們分別說明:
- @Api 注解可以用來標(biāo)記當(dāng)前 Controller 的功能。
- @ApiOperation 注解用來標(biāo)記一個(gè)方法的作用。
- @ApiImplicitParam 注解用來描述一個(gè)參數(shù),可以配置參數(shù)的中文含義,也可以給參數(shù)設(shè)置默認(rèn)值,這樣在接口測試的時(shí)候可以避免手動輸入。
- 如果有多個(gè)參數(shù),則需要使用多個(gè) @ApiImplicitParam 注解來描述,多個(gè) @ApiImplicitParam 注解需要放在一個(gè) @ApiImplicitParams 注解中。
- 需要注意的是,@ApiImplicitParam 注解中雖然可以指定參數(shù)是必填的,但是卻不能代替 @RequestParam(required = true) ,前者的必填只是在 Swagger 框架內(nèi)必填,拋棄了 Swagger ,這個(gè)限制就沒用了,所以假如開發(fā)者需要指定一個(gè)參數(shù)必填, @RequestParam(required = true) 注解還是不能省略。
- 如果參數(shù)是一個(gè)對象(例如上文的更新接口),對于參數(shù)的描述也可以放在實(shí)體類中。例如下面一段代碼:
@ApiModel
public class User {
@ApiModelProperty(value = "用戶id")
private Integer id;
@ApiModelProperty(value = "用戶名")
private String username;
@ApiModelProperty(value = "用戶地址")
private String address;
//getter/setter
}
好了,經(jīng)過如上配置之后,接下來,刷新剛剛打開的頁面,可以看到如下效果:
可以看到,所有的接口這里都列出來了,包括接口請求方式,接口地址以及接口的名字等,點(diǎn)開一個(gè)接口,可以看到如下信息:
可以看到,接口的參數(shù),參數(shù)要求,參數(shù)默認(rèn)值等等統(tǒng)統(tǒng)都展示出來了,參數(shù)類型下的 query 表示參數(shù)以 key/value 的形式傳遞,點(diǎn)擊右上角的 Try it out,就可以進(jìn)行接口測試:
點(diǎn)擊 Execute 按鈕,表示發(fā)送請求進(jìn)行測試。測試結(jié)果會展示在下面的 Response 中。
小伙伴們注意,參數(shù)類型下面的 query 表示參數(shù)以 key/value 的形式傳遞,這里的值也可能是 body,body 表示參數(shù)以請求體的方式傳遞,例如上文的更新接口,如下:
當(dāng)然還有一種可能就是這里的參數(shù)為 path,表示參數(shù)放在路徑中傳遞,例如根據(jù) id 查詢用戶的接口:
當(dāng)然,除了這些之外,還有一些響應(yīng)值的注解,都比較簡單,小伙伴可以自己摸索下。
4. 在 Security 中的配置
如果我們的 Spring Boot 項(xiàng)目中集成了 Spring Security,那么如果不做額外配置,Swagger 文檔可能會被攔截,此時(shí)只需要在 Spring Security 的配置類中為 Swagger 相關(guān)的文件和接口放行即可(SpringBoot2.7.1 最新寫法):
@Configuration
public class SecurityConfig {
@Bean
WebSecurityCustomizer webSecurityCustomizer() {
return new WebSecurityCustomizer() {
@Override
public void customize(WebSecurity web) {
web.ignoring().antMatchers("/swagger-ui/**")
.antMatchers("/swagger-resources/**")
.antMatchers("/v3/**");
}
};
}
}
如此之后,Swagger 文件就不需要認(rèn)證就能訪問了。不知道小伙伴們有沒有看懂呢?