Проверка верблюда Json вызывает исключение NoJsonBodyValidationException - PullRequest
0 голосов
/ 06 октября 2019

Я пытаюсь выполнить проверку заголовка для входящего GET-запроса. Я сослался на компонент валидатора схемы Camel JSON и выполнил следующие шаги для реализации в моем проекте, т.е.

  • Добавление зависимости camel-json-validator-starter в build.gradle
  • Добавление Employee.json (YAML преобразован в JSON) в папке Resource моего загрузочного проекта Spring. Здесь изначально у меня был файл спецификации Open API 3.0 yaml, и я преобразовал его в json
  • Вызов проверки с кодом ниже

    rest(/employee).id("get-employee")
        .produces(JSON_MEDIA_TYPE)
        .get()
        .description("The employee API")
        .outType(EmployeeResponse.class)
        .responseMessage()
          .code(HttpStatus.OK.toString())
          .message("Get Employee")
        .endResponseMessage()
        .route()
        .to("json-validator:openapi.json")
        .to("bean:employeeService?method=getEmployee()");
    

Запуск бросков проектаorg.apache.camel.component.jsonvalidator.NoJsonBodyValidationException, я использую запрос GET, но почему он ожидает тело запроса, я просто хотел проверить заголовки и запросить параметр из входящего запроса. Я не уверен, что мой подход правильный и чего мне не хватает.

Ответы [ 2 ]

1 голос
/ 09 октября 2019

Я столкнулся с этой проблемой в прошлом году при внедрении 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.

0 голосов
/ 07 октября 2019

failOnNullBody (продюсер) - происходит ли сбой, если тела не существует.

Значение по умолчанию - true

Попробуйте установить параметр в своем вызове:

.to("json-validator:openapi.json?failOnNullBody=false")
...