必須プロパティーのスキーマ定義の確認

必須の存在条件と値の制約を区別し、実際の API 仕様に合わせて定義してください。

説明

オブジェクトスキーマの required は存在が必須のプロパティー名を指定し、properties は各値の形式や制約を定義します。必須名が同じ properties にないだけで仕様が矛盾するわけではありません。追加プロパティーが許可されていたり、allOf など別のスキーマで定義されていたりする場合があります。

想定される影響

必須フィールドの定義がどこにもないと、利用者が必要な値を判断しにくく、型の検証も不十分になる場合があります。逆に追加プロパティーを禁止し、必須名も許可しないと、条件を満たすオブジェクトを作れないことがあります。

対処方法

合成されたスキーマと additionalProperties を確認し、必要な型と制約を適切な位置に定義してください。実際の必須条件を維持し、同じ properties にないという理由だけで required から削除しないでください。

例

OpenAPI 3.0 のオブジェクトスキーマの抜粋です。info と paths は省略しています。変更前も name の存在は必須です。追加プロパティーを禁止していないため、この構造自体は矛盾していません。

変更前

json
{
  "openapi": "3.0.0",
  "components": {
    "schemas": {
      "Example": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "age": {
            "type": "integer"
          }
        }
      }
    }
  }
}

変更後

json
{
  "openapi": "3.0.0",
  "components": {
    "schemas": {
      "Example": {
        "type": "object",
        "required": [
          "name"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "age": {
            "type": "integer"
          }
        }
      }
    }
  }
}

変更後は name の型を文字列に指定しています。存在条件に値の制約を加えるため、以前は有効だった他の型の値を拒否する場合があります。実際の仕様に合わせて選択してください。

参考資料