Как документировать структуры смешанных типизированных массивов в запросах/ответах с помощью Spring REST Docs

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

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

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

Выкладываю пример проекта на гитхаб: 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] не работает и интерпретируется как []. Как лучше всего поступить в этой ситуации?

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


person Dieter    schedule 06.05.2020    source источник


Ответы (1)


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

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

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

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

person Andy Wilkinson    schedule 09.05.2020
comment
Я создал быстрое решение, которое работает для списков. Может быть, вы можете взглянуть на него? - person Dieter; 11.05.2020