
SpringfoxでSwaggerAPI仕様書を自動生成する (詳細設定編:1)
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
こんにちは。しがないOLくにきちです。
ブログ書くのが少し空いてしまっていたら、いつの間にか Springfox のバージョンが上がって 2.7.0 -> 2.8.0 になっておりました!ヽ(▽`)ノワーイ♪
前回のブログで設定した内容に追加をしたいと思いますので、後述します。
本ブログの構成
- バージョンアップに伴う設定の追加
- Swagger ドキュメントのカスタマイズ
- API定義(@Api)
- API操作定義(@ApiOperation)
- レスポンス定義(@ApiResponses、@ApiResponse)
- パラメータ定義(@ApiParam)
 
- API定義(
バージョンアップに伴う設定の追加
冒頭で書きましたが、Springfox のバージョンが 2.7.0 -> 2.8.0 になりました。
このアップデートで Swagger-ui が 3系 になっているので、見た目がガラリと変わります。
また、前回のバージョン 2.7.0 では、 pattern や size などを定義するBeanValidatorPluginsConfiguration というプラグインを設定しても Swagger-ui で正しく表示されていませんでした。このバージョンアップデートを機に、BeanValidatorPluginsConfiguration が機能するようになっていましたので、設定を追加します。
設定は簡単で、前回作成した Swaggerドキュメント定義クラス SwaggerConfiguration に BeanValidatorPluginsConfiguration.class を import するだけです。この設定により、ソースコードから pattern や size を自動的に抽出、表示できるようになります。
ライブラリの追加
compile "io.springfox:springfox-bean-validators:$springfoxVersion"
SwaggerConfigurationの設定追加
@EnableSwagger2
@Configuration
@Import(BeanValidatorPluginsConfiguration.class)
public class SwaggerConfiguration {
    .....
}
Swagger ドキュメントのカスタマイズ
ここでは、各 API やパラメータ、レスポンスなどに関する説明文などを細かく設定していきます。
主に下記の設定を行います。()内は定義する際に使用するアノテーションを記述しています。
※ 前編・後編にわけます。
- API定義(@Api)
- API操作定義(@ApiOperation)
- レスポンス定義(@ApiResponses、@ApiResponse)
- パラメータ定義(@ApiParam)
- モデル定義(@ApiModel)
- フィールド定義(@ApiModelProperty)
では、それぞれの設定について説明します。
API定義(@Api)
API リソースについて定義します。
Controller クラスに @Api を付加し、API のタグや説明などを設定することができます。
主要なメソッド
| メソッド | 説明 | 
|---|---|
| tags | API の tag を指定します。(複数可) 指定したタグごとにカテゴライズされて表示されます。 | 
| description | API の簡単な説明を指定します。(default: クラス名) | 
設定例
以下の例では、会員情報の操作を行う API として、「Member」というタグを設定しています。
@Api(
    tags = "Member",
    description = "Member operations"
)
public class MemberController { ... }
Swagger-ui 表示例
API操作定義(@ApiOperation)
API リソース内の単一の操作について定義します。
Controller 内で定義している HTTP メソッドに @ApiOperation を付加し、操作に関する説明を設定することができます。
主要なメソッド
| メソッド | 説明 | 
|---|---|
| value | API の簡単な説明を指定します。(summaryフィールドに相当) | 
| description | API の詳細な説明を指定します。(notesフィールドに相当) | 
設定例
以下の例では、会員登録操作に関する説明を設定しています。
@ApiOperation(
    value = "会員情報を登録します",
    notes = "会員情報を登録します。結果として作成した会員情報を返します。"
)
@RequestMapping(method = RequestMethod.POST)
public ResponseEntity<Resource<Member>> createMember( ... ) { ... }
Swagger-ui 表示例
POST や /members を設定せずにソースコードから情報を抽出して表示していることがわかります。
※ ただし、/members API群 を表示するには SwaggerConfiguration にて対象とする RequestHandler(/members/**) を定義する必要があります。詳しくは前回の環境設定編をご確認ください。
レスポンス定義(@ApiResponses、@ApiResponse)
レスポンスについて定義します。
Controller 内で定義している HTTP メソッドに @ApiResponses や @ApiResponse を用いて、HTTPステイタスコードやレスポンスに関する説明を設定することができます。レスポンスが複数存在する際に @ApiResponses を用います。
※ GET、DELETE などの HTTP メソッド毎にレスポンスを設定することができます。同じ記述を何度も行うのは手間なので、SwaggerConfiguration で共通レスポンスを定義することも検討しましょう。詳しくは前回の環境設定編をご確認ください。
主要なメソッド(@ApiResponse)
| メソッド | 説明 | 
|---|---|
| code | HttpStatusCode を指定します。( ResponseのCodeフィールドに相当) | 
| message | レスポンスの説明を指定します。( ResponseのDescriptionフィールドに相当) | 
| response | レスポンスとなるモデルを指定します。( Response のExample Value / Model に相当) | 
設定例
以下の例では、成功時に Member 、失敗時には ErrorResponse を表示するように設定しています。
// ApiOperation は省略
@ApiResponses(value = {
    @ApiResponse(code = 200, message = "登録した会員情報", response = Member.class),
    @ApiResponse(code = 400, message = "リクエストに必須の項目が不足、または不正な値を指定している。", response = ErrorResponse.class),
    @ApiResponse(code = 409, message = "指定した識別子が、既存の識別子と重複している。", response = ErrorResponse.class)
})
@RequestMapping(method = RequestMethod.POST)
public ResponseEntity<Resource<Member>> createMember( ... ) { ... }
Swagger-ui 表示例
Model を見ると pattern を設定せずにソースコードから情報を抽出して表示していることがわかります。
これは、最初に設定した BeanValidatorPluginsConfiguration によるものです。
また、レスポンスの各フィールドに説明などを設定したい場合は、response で指定したモデルクラス(例えば Member.class)に @ApiModelProperty を用いて定義する必要があります。(現時点では設定していない状態です。)
パラメータ定義(@ApiParam)
パラメータについて定義します。
HTTP メソッドの引数に @ApiParam を付加し、リクエストパラメータに関する説明を設定することができます。
主要なメソッド
| メソッド | 説明 | 
|---|---|
| name | パラメータ名を指定します。(default: 引数名) | 
| required | パラメータの説明を指定します。(default: 引数名) | 
| value | パラメータが必須かどうかを指定します。(default: false) | 
設定例
以下の例では、会員情報登録のリクエストに関する設定をしています。
あえて request という名前を body に変換していますが、そのままの名前で問題ない場合は、 name の設定は不要です。
public ResponseEntity<Resource<Member>> createMember(
    @ApiParam(name = "body", required = true, value = "登録する会員情報")
    @Validated @RequestBody CreateMemberRequest request) { ... }
Swagger-ui 表示例
パラメータのタイプ(body や path 等)を設定せずに、ソースコードから情報を抽出して表示していることがわかります。レスポンス同様、こちらの Model も pattern を設定せずにソースコードから情報を抽出して表示しています。
ここまでの設定における Swagger-ui 表示例
まとめ
ちょっと長くなって来たので、今回は一旦ここまで。
今回は詳細設定編として、API定義、API操作定義、レスポンス定義、パラメータ定義 までを簡単に書いてみました。Springfox は、Spring の機能を利用して Swagger ドキュメントを生成するので、細かく設定を記述する必要がないところが良いですね。
次回は、モデル定義(@ApiModel)、フィールド定義(@ApiModelProperty)について書きたいと思います。

















