RestDoc объекта, который может содержать другой объект того же класса

#spring #spring-restdocs

#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:

Найдено отвратительное решение, которое не работает для «бесконечного» множества объектов, но, по крайней мере, оно работает для 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 ...
);
 

Я открыт для лучших решений…
в противном случае я надеюсь, что этот позор может кому-то помочь