如何在 RAML 1.0 中覆盖对象数组属性类型

Posted

技术标签:

【中文标题】如何在 RAML 1.0 中覆盖对象数组属性类型【英文标题】:How to override an object array property type in RAML 1.0 【发布时间】:2016-05-22 14:10:03 【问题描述】:

我有一个像这样的通用 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 我总是得到“非法覆盖从响应继承的属性数据”。

另一个想法是使用repeat

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

分别

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

现在非法覆盖消失了,但在 API 控制台中,我现在收到“未捕获的类型错误”。

如何解决?还是我需要一种完全不同的方法?有什么想法吗?

【问题讨论】:

【参考方案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 tests 带有大量测试用例,但第一次尝试时找不到解决方案。 这是一个包含字符串collectionSchema in double angle brackets (from raml-for-jaxrs) 语法的特定测试用例资源,看起来很可疑? 使用 API 生成预期输入的序列化版本,例如你的List&lt;MyDataType&gt;,并修改生成的输出。例如。使用与第 1 点相同的 raml-java-parser。 查找整个文件规范的参考,包括复杂类型。似乎this 和this 可以包含有趣的信息,例如“带有type 的地图/字典或外部类型可能需要包含的事实。也许this answer link 对此有所帮助。 您问题上的 raml 标签目前只有 37 个用户关注。是否有更通用的标签,以便针对更广泛的受众?

20 分钟前我对 RAML 一无所知,所以不要把这当作一个完整的答案,而是一个快速的猜测。

【讨论】:

【参考方案3】:

您说“以及使用时”: 身体: 类型:响应 特性: 数据:MyDataType[]

您已经将上面的“响应”类型定义为具有“数据”属性作为“对象[]”。 “MyDataType”从何而来?只需在此处删除“属性”并仅具有“类型:响应”即可。然后错误应该消失。 也许您希望您的响应类型具有“任何 []”。我不知道你想做什么。也许定义另一个继承您的响应类型的类型。

【讨论】:

也许您错过了 Java 类型声明和问题中提到的泛型,但 any 会删除错误但不记录任何内容,这不是使用端点文档工具的意图。

以上是关于如何在 RAML 1.0 中覆盖对象数组属性类型的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Raml 的外部文件中定义一个类型的数组?

RAML 1.0:在可选对象中定义 minProperties

RAML 1.0,映射类型复杂的正则表达式

如何让两个 raml 属性互斥?

使用 Raml 验证标头

如何在 Anypoint Studio 项目中更改 RAML 版本