对象的RestDoc可能包含同一类的另一个等距

时间:2019-04-19 08:52:15

标签: spring spring-restdocs

我有一个可以简化如下的对象:

{
    "myObject": {
        "values": [
            "a string value",
            123456, // a number value
            true, // a boolean value
            { // an object with an array of values
                "values": [
                    // same as before...
                    // it allows string/number/boolean/object
                ]
            }
        ]
    }
}

因此,我尝试为此对象编写一个FieldDescriptor,但我不知道(而且我也找不到)如何记录这一事实,即它可能包含许多“无限”类似其自身结构的对象


我也可以不要记录数组部分的内部内容,但是如果我尝试这样做,则会出现此错误:

  

未记录有效载荷的以下部分:

{
    "myObject":[
       {
          "values":[
             {
                "values":[ "pasta" ]
             },
             {
                "values":[ "pizza" ]
             },
             {
                "values":[ "mandolino" ]
             }
          ]
       }
    ]
}

我的代码

public static List<FieldDescriptor> myObjectDescriptor = List.of(
    fieldWithPath("values").type(JsonFieldType.ARRAY).description("May be an array of 'STRING', 'BOOLEAN', 'NUMBER', or 'myObjectDescriptor'").optional(),
    fieldWithPath("values[].*").type(JsonFieldType.VARIES).description("you know...").optional(),
);

正如我之前所说,我也尝试擦除第二个fieldWithPath,但是错误仍然存​​在。

YAML OpenAPI定义

myObject:
  type: object
  properties:
    values:
      items:
        type: object
        # I am not using 'oneOf' here because
        # of reasons not related with the question
        # oneOf:
        #   - type: integer
        #   - type: string
        #   - type: boolean
        #   - $ref: '#/myObject'
      type: array
      description: an array of 'STRING', 'BOOLEAN', 'NUMBER', or 'myObject'

编辑:YAML是正确的,我不能在同一值数组中包含整数和字符串,为简单起见,我在上面做了此操作。

1 个答案:

答案 0 :(得分:0)

找到了一个令人厌恶的解决方案,该解决方案不适用于“无限”多个对象,但至少适用于n层...

public static List<FieldDescriptor> myObjectDescriptor = List.of(
    fieldWithPath("values").type(JsonFieldType.ARRAY).description("May be an array of 'STRING', 'BOOLEAN', 'NUMBER', or 'myObjectDescriptor'").optional(),
    fieldWithPath("values[].*").type(JsonFieldType.VARIES).description("you know...").optional(),
    fieldWithPath("values[].values").type(JsonFieldType.ARRAY).description("don't look at me").optional(),
    fieldWithPath("values[].values[].*").type(JsonFieldType.VARIES).description("this is terrible").optional(),
    // ... and so on ...
);

我愿意寻求更好的解决方案... 否则,我希望这个耻辱可以帮助某人