Как переопределить тип свойства массива объектов в RAML 1.0

У меня есть общий тип Java, например:

class Response<D> {
  List<D> data;
}

и хотите создать нечто похожее с RAML 1.0 (где я новичок).

Мой первый подход был

types:
  Response:
    type: object
    properties:
      data: object[]

и при его использовании

body:
  type: Response
    properties:
      data: MyDataType[]

Из API-Workbench я всегда получаю "Незаконное переопределение данных свойств, унаследованных от Response".

Другая идея заключалась бы в использовании repeat:

types:
  Response:
    type: object
    properties:
      data: object
      repeat: true

и соответственно

body:
  type: Response
    properties:
      data: MyDataType
      repeat: true

Теперь незаконное переопределение ушло, но в API-консоли теперь я получаю "Uncaught TypeError".

Как это решить? Или мне нужен совершенно другой подход? Любая идея?

Ответ 1

Как я понимаю, Response абстрагирует разные типы данных, но имеет схожий формат. Один из подходов состоит в том, чтобы абстрагировать подобие ответа с помощью resourceTypes и определить ваши конкретные данные в types.

#%RAML 1.0
title: New API
version: v1
baseUri: http://api.samplehost.com
mediaType: application/json

types:
  User:
    usage: A user in the system    
    properties:
      firstname:
        required: true
      lastname:
        required: true

  ArticleId:
    usage: An id of any article in the system
    type: number

  Article:
    usage: Pattern for any article in the system
    properties:
      id:
        type: ArticleId
        required: true
      created:
        type: date
        required: true

#######################################
# the following captures the similarity:
#######################################

resourceTypes:
  collection:
    get:
      responses:
        200:
          body:
            properties:
              data: <<typename>>[]


###############
# API:
############### 

/user:
  description: All the users
  type:
    collection:
      typename: User

/article:
  description: All the articles
  type:
    collection:
      typename: Article     

Ответ 2

В решении этой проблемы я вижу следующие варианты:

  • Хранилища с открытым исходным кодом для тестовых ящиков, которые, надеюсь, документируют ваши требования. Я нашел этот проект тесты raml-java-parser с загрузкой тестовых ящиков, но не смог найти решение с первой попытки. Вот конкретный ресурс тестовой системы, содержащий строку collectionSchema в двойных угловых скобках (из raml-for-jaxrs), выглядит подозрительно?
  • Используйте API для создания сериализованной версии ожидаемого ввода, например. ваш List<MyDataType> и переработайте сгенерированный вывод. Например. используя тот же raml-java-parser из точки 1.
  • Найдите ссылку для всей спецификации файла, включая сложные типы. Кажется, что this и это может включать в себя интересную информацию, например "map/dictionary with type{} или тот факт, что внешние типы могут нуждаться в включении. Возможно, эта ссылка ответа помогает от этого имени.
  • В теге raml вашего вопроса в настоящее время следуют только 37 пользователей. Существуют ли более общие теги, чтобы привлечь более широкую аудиторию?

Я ничего не знал о RAML 20 минут назад, поэтому не рассматривайте это как полный ответ, но быстро догадайтесь.

Ответ 3

Вы сказали "и при использовании": тело: type: Response   свойства:     data: MyDataType []

Вы уже определили тип "Ответ" выше, чтобы иметь свойство "data" как "object []". Откуда появился "MyDataType"? Просто удалите "свойства" здесь и просто введите "type: Response". Тогда ошибка должна исчезнуть.
Возможно, вы хотите, чтобы ваш тип ответа имел "any []". Я не могу сказать, что вы пытаетесь сделать. Может быть, определить другой тип, который наследует ваш тип ответа.