0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OpenAPIのアノテーション

Last updated at Posted at 2025-09-04

引き続き、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のクラス単位で指定するのがベストだと思う

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?