説明
allOf で合成したスキーマではすべての分岐の制約が適用され、後の定義が前の定義を上書きするわけではありません。同じプロパティー名を繰り返すこと自体は許可されています。ただし、一方が整数、他方が文字列を要求すると、その値は両方の条件を満たせません。
想定される影響
プロパティーを含むデータが検証に失敗したり、文書や生成モデルが実際の制約を正しく表せなかったりする可能性があります。任意のプロパティーなら、それがないオブジェクトは有効な場合があります。
対処方法
同じプロパティーに適用されるすべての型と制約を確認し、実際の仕様に合わせて矛盾を解消してください。互換性のある制約を加える正常な allOf は維持し、名前が同じという理由だけで変更しないでください。
例
OpenAPI 3.0 スキーマの抜粋で、info と paths は省略しています。変更前の code の値には整数と文字列が同時に要求されますが、両方は満たせません。code 自体は必須ではありません。
変更前
json
{
"openapi": "3.0.0",
"components": {
"schemas": {
"ErrorModel": {
"type": "object",
"properties": {
"code": {
"type": "integer"
}
},
"allOf": [
{
"type": "object",
"properties": {
"code": {
"type": "string"
}
}
}
]
}
}
}
}
変更後
json
{
"openapi": "3.0.0",
"components": {
"schemas": {
"ErrorModel": {
"type": "object",
"properties": {
"code": {
"type": "integer"
},
"rootCause": {
"type": "string"
}
}
}
}
}
}
変更後は整数の code と文字列の rootCause を別々に定義しています。実際に両方のフィールドが必要な場合に適切であり、名前の分離が重複する制約すべてに必要な対処ではありません。