2016-10-26 7 views
1

Я хотел бы разместить объект JSON в теле вызова REST API. Атрибут data этого объекта DATA содержит обязательный атрибут timestamp, а затем ряд различных атрибутов в зависимости от источника объекта Data. Насколько я понял, additionalProperties предназначен для этого и по умолчанию false или указывает объект схемы для каждого не определенного атрибута.Ошибка схемы Swagger with AdditionalProperties

После Swagger YAML

/my/path: 
    post: 
    tags: [Tag] 
    description: Description 
    parameters: 
    - name: data 
     in: body 
     description: The actual data. 
     required: false 
     type: object 
     schema: 
     $ref: "#/definitions/Data" 

definitions/ 
    Data: 
    type: object 
    properties: 
     source: 
     type: string 
     data: 
     type: object 
     properties: 
      timestamp: 
      type: string 
      format: date-time 
     additionalProperties: 
      type: string 

должны пройти оба объекта отправить:

{ 
    "source": "A", 
    "data": { 
    "timestamp": "2016-10-26T01:12:40.329Z", 
    } 
} 

и:

{ 
    "source": "B", 
    "data": { 
    "timestamp": "2016-10-26T01:12:40.329Z", 
    "newProp":"newValue" 
    } 
} 

Однако все я получаю это ошибка проверки: ValidationError: child "data" fails because ["test" is not allowed]

Что я делаю неправильно или я искажая атрибут, описанный в документации: http://swagger.io/specification/

+1

Alx, я не знаю, если ответ, который я предоставил, слишком поздно, чтобы быть полезным. Но если предоставленная вами информация не согласуется с результатами, которые вы видите, предоставьте некоторые сведения об ошибке проверки. В частности, где вы видели эту ошибку? Какой процессор Swagger или средство проверки схемы подготовили его? –

ответ

-1

я на самом деле понял это сам, для справки:

definitions/ 
    Data: 
    type: object 
    properties: 
     source: 
     type: string 
     data: 
     required: 
     - timestamp 
     type: object 
     properties: 
      timestamp: 
      type: string 
      format: date 
     additionalProperties: true 
+0

'additonalProperties: true' не поддерживается в OpenAPI/Swagger 2.0 (который вы используете), он поддерживается только в OpenAPI 3.0. – Helen

+0

Спасибо за ваш ответ и указав текущие обновления. Я думаю, что время изменилось, поэтому поиск самых актуальных документов API всегда рекомендуется. Очень признателен – Alx

1

Я не уверен, если your solution получил вашу прошлую проблему. Я вижу несколько отличий от исходной задачи схемы:

  • timestamp теперь использует date вместо формата datetime.
  • timestamp теперь требуется.
  • additionalProperties установлен в true.

Однако в Swagger имеется ряд неясных ограничений относительно дополнительных свойств, которые у нас есть documented in detail here.

По существу, в то время как ваша оригинальная схема отлично действует в соответствии с спецификацией Swagger, Java-библиотека с swagger-core не будет обрабатывать ее правильно. Он отбросит либо ваше явно определенное свойство timestamp, либо отменит additionalProperties.

Починка, на удивление, является извлечение встроенной схемы для data собственности его собственное определение схемы верхнего уровня:

definitions: 

    Data: 
    type: object 
    properties: 
     source: 
     type: string 
     data: 
     $ref: "#/definitions/DataValues" 

    DataValues: 
    type: object 
    properties: 
     timestamp: 
     type: string 
     format: date-time 
    additionalProperties: 
     type: string 

Я думаю, что ваша пересмотренная схема не будет работать правильно, потому что additionalProperties булевых значений от true или false игнорируются ядром swagger. По-видимому, это был надзор в спецификации; Swagger didn't intend для поддержки этого аспекта схемы JSON.

Смежные вопросы