Я столкнулся с этой проблемой в прошлом году при внедрении OpenAPI и пришел к выводу, что это было слишком много работы. Я не смог получить ПОЛНУЮ валидацию от валидатора JSON с использованием OpenAPI, потому что были некоторые различия между способом, которым OpenAPI объявляет определения схемы и полные определения схемы JSON.
Просматривая документацию по компоненту проверки JSON, вы обнаружите это:
Компонент JSON Schema Validator выполняет проверку bean-компонента тела сообщения по черновику JSON Schemas v4 с использованием библиотеки JN-схемы NetworkNT (https://github.com/networknt/json-schema-validator).
Переход к вышеупомянутому github показывает следующую строку: Валидатор json-схемы Java, поддерживающий черновой вариант json-схемы v4. Это ключевой компонент в нашей инфраструктуре микросервисов light-4j для проверки запроса на соответствие спецификации OpenAPI для light-rest-4j и схема RPC для light-hybrid-4j во время выполнения.
Верблюд не light-rest-4j.
До того, как япокажу вам более подробный пример. Посмотрите на пример, приведенный в документации на верблюдах: https://camel.apache.org/components/latest/json-validator-component.html. Сравните этот файл схемы json с определениями схемы openAPI, и вы увидите, что они не совпадают.
Полезный инструмент здесь https://jsonschema.net, вы можете вставить сюда пример json и вывести схему. Я использую этот инструмент и OpenAPI Pet StorНапример, в приведенном ниже примере
OpenAPI Petstore Pet Object Пример:
{
"id": 0,
"category": {
"id": 0,
"name": "string"
},
"name": "doggie",
"photoUrls": [
"string"
],
"tags": [
{
"id": 0,
"name": "string"
}
],
"status": "available"
}
Спецификация openAPI, сохраненная в JSON, дает следующее определение:
"Pet": {
"type": "object",
"required": [
"name",
"photoUrls"
],
"properties": {
"id": {
"type": "integer",
"format": "int64"
},
"category": {
"$ref": "#/definitions/Category"
},
"name": {
"type": "string",
"example": "doggie"
},
"photoUrls": {
"type": "array",
"xml": {
"name": "photoUrl",
"wrapped": true
},
"items": {
"type": "string"
}
},
"tags": {
"type": "array",
"xml": {
"name": "tag",
"wrapped": true
},
"items": {
"$ref": "#/definitions/Tag"
}
},
"status": {
"type": "string",
"description": "pet status in the store",
"enum": [
"available",
"pending",
"sold"
]
}
},
"xml": {
"name": "Pet"
}
}
Когда я конвертируюдля правильного синтаксиса схемы JSON схема JSON выглядит следующим образом:
{
"definitions": {},
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "http://example.com/root.json",
"type": "object",
"title": "The Root Schema",
"required": [
"id",
"category",
"name",
"photoUrls",
"tags",
"status"
],
"properties": {
"id": {
"$id": "#/properties/id",
"type": "integer",
"title": "The Id Schema",
"default": 0,
"examples": [
0
]
},
"category": {
"$id": "#/properties/category",
"type": "object",
"title": "The Category Schema",
"required": [
"id",
"name"
],
"properties": {
"id": {
"$id": "#/properties/category/properties/id",
"type": "integer",
"title": "The Id Schema",
"default": 0,
"examples": [
0
]
},
"name": {
"$id": "#/properties/category/properties/name",
"type": "string",
"title": "The Name Schema",
"default": "",
"examples": [
"string"
],
"pattern": "^(.*)$"
}
}
},
"name": {
"$id": "#/properties/name",
"type": "string",
"title": "The Name Schema",
"default": "",
"examples": [
"doggie"
],
"pattern": "^(.*)$"
},
"photoUrls": {
"$id": "#/properties/photoUrls",
"type": "array",
"title": "The Photourls Schema",
"items": {
"$id": "#/properties/photoUrls/items",
"type": "string",
"title": "The Items Schema",
"default": "",
"examples": [
"string"
],
"pattern": "^(.*)$"
}
},
"tags": {
"$id": "#/properties/tags",
"type": "array",
"title": "The Tags Schema",
"items": {
"$id": "#/properties/tags/items",
"type": "object",
"title": "The Items Schema",
"required": [
"id",
"name"
],
"properties": {
"id": {
"$id": "#/properties/tags/items/properties/id",
"type": "integer",
"title": "The Id Schema",
"default": 0,
"examples": [
0
]
},
"name": {
"$id": "#/properties/tags/items/properties/name",
"type": "string",
"title": "The Name Schema",
"default": "",
"examples": [
"string"
],
"pattern": "^(.*)$"
}
}
}
},
"status": {
"$id": "#/properties/status",
"type": "string",
"title": "The Status Schema",
"default": "",
"examples": [
"available"
],
"pattern": "^(.*)$"
}
}
}
Существуют некоторые различия между определением схемы OpenAPI и определением схемы JSON.