Swaggerは、RESTful Webサービスの仕様書をコードから自動的に生成し、開発フェーズにおけるAPI仕様の乖離を防ぐための強力なツールです。以下に、Springプロジェクトへの統入手順と設定方法を解説します。
1. Maven依存関係の追加
まず、ビルド設定ファイル(pom.xml)にSpringFoxのライブラリを追加します。これにより、Swaggerのコア機能とUI表示機能が利用可能になります。
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
2. Swagger設定クラスの作成
設定クラスを作成し、Springのコンフィギュレーションとして登録します。ここでは、ドキュメントのタイトル、説明、バージョンなどのメタ情報を定義するとともに、APIをスキャンするベースパッケージを指定します。
package com.example.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration
@EnableSwagger2
public class SwaggerDocumentConfig {
@Bean
public Docket apiEndpoint() {
return new Docket(DocumentationType.SWAGGER_2)
.groupName("public-api")
.apiInfo(metadata())
.select()
.apis(RequestHandlerSelectors.basePackage("com.example.controller"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo metadata() {
return new ApiInfoBuilder()
.title("Sales Management REST API")
.description("SpringFoxを用いた販売管理システムのAPIインターフェース定義")
.termsOfServiceUrl("https://www.example.com/terms")
.version("1.1.0")
.build();
}
}
3. コントローラクラスへのアノテーション適用
APIドキュメントに表示したいコントローラおよびエンドポイントに対して、Swaggerのアノテーションを付与します。クラスレベルでは@Apiを、メソッドレベルでは@ApiOperationを使用して詳細な説明を記述します。ここでは例として、従業員データを扱うEmployeeControllerを実装します。
package com.example.controller;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/v1/employees")
@Api(tags = "従業員管理API")
public class EmployeeController {
@PostMapping
@ApiOperation(value = "従業員登録", notes = "新しい従業員情報をシステムに登録します")
@ApiImplicitParams({
@ApiImplicitParam(name = "payload", value = "従業員情報JSON", required = true, paramType = "body", dataType = "Map")
})
public Map<String, Object> register(@RequestBody Map<String, Object> payload) {
payload.put("status", "registered");
return payload;
}
@DeleteMapping("/{empId}")
@ApiOperation(value = "従業員削除", notes = "指定されたIDの従業員を削除します")
@ApiImplicitParams({
@ApiImplicitParam(name = "empId", value = "従業員ID", required = true, paramType = "path", dataType = "Long")
})
public String remove(@PathVariable Long empId) {
return "Employee ID: " + empId + " has been removed.";
}
@PutMapping("/{empId}")
@ApiOperation(value = "従業員情報更新", notes = "既存の従業員情報を更新します")
@ApiImplicitParams({
@ApiImplicitParam(name = "empId", value = "従業員ID", required = true, paramType = "path", dataType = "Long"),
@ApiImplicitParam(name = "payload", value = "更新情報JSON", required = true, paramType = "body", dataType = "Map")
})
public Map<String, Object> modify(@PathVariable Long empId, @RequestBody Map<String, Object> payload) {
payload.put("id", empId);
payload.put("status", "updated");
return payload;
}
@GetMapping("/{empId}")
@ApiOperation(value = "従業員照会", notes = "特定の従業員情報を取得します")
@ApiImplicitParams({
@ApiImplicitParam(name = "empId", value = "従業員ID", required = true, paramType = "path", dataType = "Long")
})
public Map<String, Object> retrieve(@PathVariable Long empId) {
Map<String, Object> dummyData = new HashMap<>();
dummyData.put("id", empId);
dummyData.put("name", "Tanaka Taro");
dummyData.put("department", "Sales");
return dummyData;
}
}
4. 動作確認
アプリケーションを起動した後、ブラウザで以下のURLにアクセスします。Swagger UIが表示され、定義したAPIエンドポイントの一覧やテスト実行画面が確認できます。
http://localhost:8080/swagger-ui.html