SpringFox の required の挙動を変える[Spring][Swagger]
SpringFox の required の挙動を変えたいと思い、試みました。
まずは、状況説明から。
RequestParam アノテーションだけ付けた場合
@GetMapping("/foo") public String foo(@RequestParam Integer id) { return "bar"; }
上記のような場合、id は必須になります。
テキストフィールドに required って表示されてますね。
RequestParam アノテーションの required のデフォルトが true だからです。
required=false
にすると swagger ui も任意になります。
ありがとう SpringFox !
RequestParam, ApiParam アノテーションの両方を付けた場合
他の情報を加えようと ApiParam アノテーションを追加してみます。
@GetMapping("/foo") public String foo(@RequestParam @ApiParam("ID") Integer id) { return "bar"; }
そうするとなんと
テキストフィールドに 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 { }
必須に変わった!
初期化処理的には、 RequestParam のチェックして ApiParam のチェックして、また RequestParam のチェックをするみたいな感じになっているのかと思います。
以上