Spring Rest Docs json форматирование запросов и ответов - PullRequest
0 голосов
/ 04 марта 2020

Получается json при использовании Preprocessors prettyPrint():

{
  "testId" : "message-1",
  "testType" : "TYPE",
  "nestedList" : [ {
    "nestedTestId" : 5,
    "nestedTestCode" : 2,
    "anotherNestedList" : [ {
      "anotherNestedFirst" : [ {
        "anotherId" : 1,
        "anotherValue" : "VALUE_1",
        "anotherDescription" : null
      }, {
        "anotherId" : 2,
        "anotherValue" : "VALUE_2",
        "anotherDescription" : "DESCRIPTION"
      } ]
    } ]
  } ]
}

Я хочу, чтобы это выглядело так:

фигурные скобки - перевод строки с небольшими (2 пробелами) списками с отступами, отформатированными большинством онлайн json форматеров.

{
  "testId": "message-1",
  "testType": "TYPE",
  "nestedList": [
    {
      "nestedTestId": 5,
      "nestedTestCode": 2,
      "anotherNestedList": [
        {
          "anotherNestedFirst": [
            {
              "anotherId": 1,
              "anotherValue": "VALUE_1",
              "anotherDescription": null
            },
            {
              "anotherId": 2,
              "anotherValue": "VALUE_2",
              "anotherDescription": "DESCRIPTION"
            }
          ]
        }
      ]
    }
  ]
}

Пробовал с Preprocessors replacePattern и другими средствами без удачи. Любая помощь будет оценена. Спасибо!

1 Ответ

0 голосов
/ 06 марта 2020

Spring REST Docs использует Джексона в его конфигурации по умолчанию для печати JSON запросов и ответов. Вы можете настроить это поведение, написав свой собственный ContentModifier с настроенным симпатичным поведением печати и создав препроцессор, который его использует:

OperationPreprocessor prettyPrint = new ContentModifyingOperationPreprocessor((content, contentType) -> {
    ObjectMapper objectMapper = new ObjectMapper();
    PrettyPrinter prettyPrinter = new DefaultPrettyPrinter()
            .withArrayIndenter(DefaultIndenter.SYSTEM_LINEFEED_INSTANCE);
    try {
        return objectMapper.writer(prettyPrinter).writeValueAsBytes(objectMapper.readTree(content));
    }
    catch (IOException ex) {
         return content;
    }
});

Ключевым моментом в приведенном выше настройке является настройка Индекс массива для использования перевода строки, а не по умолчанию, который является пробелами.

Затем вы можете использовать prettyPrint при документировании операции:

mockMvc.perform(get("/example")).andExpect(status().isOk())
    .andDo(document("example", preprocessRequest(prettyPrint), preprocessResponse(prettyPrint)));
...