#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 ...
);
Я открыт для лучших решений…
в противном случае я надеюсь, что этот позор может кому-то помочь