引き続き、OpenAPIネタです
OpenAPIの@Schemaアノテーションrequired、nullable
OpenAPIのの@Schemaアノテーションの属性には
- required = true/false
- nullable = true/false
がありますが、これは何が違うのか?
requiredはJSONのfield自体が省略可能であることを意味します
nullableはJSONのfieldがnull許可であることを意味します
required = false
{
(hogeフィールド自体がない)
}
nullable = true
{
"hoge": null
}
そして、これらをopenapi-generator-cliを使って、フロントに持って行ってTypeScriptのスタブを生成すると
required = false は 省略可能な型になります。RESTで省略で送信するときはundefinedで送ります。
'hoge'?: string;
nullable = true は nullとのunion型になります。RESTで省略で送信するときはnullで送ります
'hoge': string | null;
RESTのインタフェースの意味によって使い分けが必要です
@Validated、@Valid アノテーション
OpenAPIの各種アノテーションはクラス単位で指定できたり、メソッド単位だったり、フィールド単位だったり・・・
そのどれかが指定可能なので、何をどこで指定すべきか、何も考えず無法地帯でやってしまうと後から訳がわからなくなります
Validationチェックは@Validated、@Validのふたつのアノテーションが効いているフィールドに対して有効になります
@Validated は
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.PARAMETER})
なので、クラス、メソッド、メソッドパラメータに対して指定可能です
@Valid は
@Target({ METHOD, FIELD, CONSTRUCTOR, PARAMETER, TYPE_USE })
なので、メソッド、クラスのフィールド、コンストラクタのパラメータ、メソッドパラメータ、用箇所(ジェネリクス、配列など)に対して指定可能です
じゃ、それぞれをどこで指定するのがベストなのか?
どちらかと言うと@Validの方が細かい単位に指定可能
なので、一番わかりやすいのは
- PathParemeter、RequestParameterの場合
- @Valid をcontrollerのメソッドの引数
- RequestBodyの場合
- @Valid をcontrollerのメソッドの引数のdata class
じゃ、@Validated はどこに付けるかと言うと、クラス単位、メソッド単位、メソッドパラメータ単位で指定可能である
このふたつのアノテーションが効いていないとValidation checkが効かないので付け忘れ防止の意味で@Validated はクラス単位で付けるのがベストではないかと思う
(AIによると多少のオーバヘッドはあるが、十分無視できるレベルであると)
@Tagアノテーション
@Tag はname属性で、swaggerで見るとトップのカテゴリが分かれる
また、openapi-generator-cliを使って、フロントに持って行ってTypeScriptのスタブを生成するとobject oriented interface の単位でもある
これらの単位はcontrollerの単位と合わせたい
@Tag は
@Target({METHOD, TYPE, ANNOTATION_TYPE})
なので、クラス、メソッド、アノテーションの中で指定可能である
上記のように、controllerの単位と合わせたいのでcontrollerのクラス単位で指定するのがベストだと思う