Как задокументировать структуры массивов со смешанным типом в запросах / ответах с помощью Spring REST Docs - PullRequest
0 голосов
/ 06 мая 2020

Учитывая следующий примерный JSON документ, который представляет собой список полиморфных c объектов типов A и B:

[ {
  "a" : 1,
  "type" : "A"
}, {
  "b" : true,
  "type" : "B"
}, {
  "b" : false,
  "type" : "B"
}, {
  "a" : 2,
  "type" : "A"
} ]

Как я могу выбрать As и B для иметь возможность документировать их по-разному.

Я поместил пример проекта на github: https://github.com/dibog/spring-restdocs-polymorphic-list-demo

Вот отрывок из моей попытки документировать метод выборки:

.andDo(document("fetch-tree",
                responseFields(
                    beneathPath("[0]").withSubsectionId("typeA"),
                    fieldWithPath("type")
                        .type(JsonFieldType.STRING)
                        .description("only node types 'A' and 'B' are supported"),
                    fieldWithPath("a")
                        .type(JsonFieldType.NUMBER)
                        .description("specific field for node type A")
                ),
                responseFields(
                    beneathPath("[1]").withSubsectionId("typeB"),
                    fieldWithPath("type")
                        .type(JsonFieldType.STRING)
                        .description("only node types 'A' and 'B' are supported"),
                    fieldWithPath("b")
                        .type(JsonFieldType.BOOLEAN)
                        .description("specific field for node type A")
                )))

Но я получаю следующее сообщение об ошибке:

org.springframework.restdocs.payload.PayloadHandlingException: [0] identifies multiple sections of the payload and they do not have a common structure. The following non-optional uncommon paths were found: [[0].a, [0].b]

Похоже, что [0] или [1] не работают и интерпретируются как []. Как лучше всего разрешить эту ситуацию?

Спасибо, Дитер

1 Ответ

0 голосов
/ 09 мая 2020

Похоже, что [0] или [1] не работают и интерпретируются как [].

Верно. Добавление поддержки индексов отслеживается этой проблемой .

Как лучше всего справиться с этой ситуацией?

The beneathPath Метод, который вы пытались использовать выше, возвращает реализацию интерфейса стратегии PayloadSubsectionExtractor. Вы можете предоставить свою собственную реализацию этого интерфейса и в методе extractSubsection(byte[], MediaType) извлечь JSON для определенного элемента в массиве и вернуть его как byte[].

...