読者です 読者をやめる 読者になる 読者になる

SpringFox の required の挙動を変える[Spring][Swagger]

SpringFox の required の挙動を変えたいと思い、試みました。
まずは、状況説明から。

RequestParam アノテーションだけ付けた場合

@GetMapping("/foo")
public String foo(@RequestParam Integer id) {
    return "bar";
}

上記のような場合、id は必須になります。

f:id:t1000leaf:20161225102501p:plain

テキストフィールドに required って表示されてますね。
RequestParam アノテーションの required のデフォルトが true だからです。
required=false にすると swagger ui も任意になります。
ありがとう SpringFox !

RequestParam, ApiParam アノテーションの両方を付けた場合

他の情報を加えようと ApiParam アノテーションを追加してみます。

@GetMapping("/foo")
public String foo(@RequestParam @ApiParam("ID") Integer id) {
    return "bar";
}

そうするとなんと

f:id:t1000leaf:20161225102519p:plain

テキストフィールドに required が消えます。
ApiParam アノテーションの required のデフォルトが false だからです。
ApiParam の方の優先度が高いのです。そういう方針でしょう。

RequestParam の設定を優先させたい

なにはともあれ実際の動きは RequestParam の設定になります。
SpringFox では plugin 的な仕組みを持っていて挙動を変えることができました。
以下のような クラスを作ります。

import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import springfox.documentation.spring.web.readers.parameter.ParameterRequiredReader;

@Component
@Order(Integer.MAX_VALUE)
public class CustomizedParameterBuilderPlugin extends ParameterRequiredReader {
}

f:id:t1000leaf:20161225102541p:plain

必須に変わった!
初期化処理的には、 RequestParam のチェックして ApiParam のチェックして、また RequestParam のチェックをするみたいな感じになっているのかと思います。

以上