受这个问题的启发,我实施了一项增强功能,使原始答案(见下文)过时。
如果您使用 1.0.0.BUILD-SNAPSHOT(可从https://repo.spring.io/libs-snapshot获得),您现在可以将字段标记为已忽略。忽略的字段计数已记录在案,但实际上并未出现在文档中。
鉴于您想分离文档,有两个文档调用是有意义的。首先,您可以记录公司名称和员工数组。在第二个中,您记录员工数组并将公司名称标记为已忽略。
您的测试将如下所示:
mockMvc.perform(get("/company/5").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andDo(document("company",
responseFields(
fieldWithPath("companyName").description(
"The name of the company"),
fieldWithPath("employee").description(
"An array of the company's employees"))))
.andDo(document("employee",
responseFields(
fieldWithPath("companyName").ignored(),
fieldWithPath("employee[].name").description(
"The name of the employee"),
fieldWithPath("employee[].age").description(
"The age of the employee"))));
您最终会得到两个片段目录,一个是命名的company
,一个是命名employee
的。然后,您可以使用response-fields.adoc
每个片段。
原始答案
当您记录请求或响应时,没有明确支持忽略字段,但我认为您可以通过使用预处理器删除您不想记录的字段来实现您想要的。
鉴于您想分离文档,进行两次document
调用是有意义的。首先,您可以记录公司名称和员工数组。在第二个中,您需要预处理删除公司的请求,然后记录员工数组。
您的测试将如下所示:
mockMvc.perform(get("/company/5").accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andDo(document("company",
responseFields(
fieldWithPath("companyName").description(
"The name of the company"),
fieldWithPath("employee").description(
"An array of the company's employees"))))
.andDo(document("employee",
preprocessResponse(removeCompany()),
responseFields(
fieldWithPath("employee[].name").description(
"The name of the employee"),
fieldWithPath("employee[].age").description(
"The age of the employee"))));
注意preprocessResponse
在第二次document
调用中的使用。removeCompany
返回使用自定义ContentModifier
从响应中删除公司名称的预处理器:
private OperationPreprocessor removeCompany() {
return new ContentModifyingOperationPreprocessor(new ContentModifier() {
@Override
public byte[] modifyContent(byte[] originalContent, MediaType contentType) {
ObjectMapper objectMapper = new ObjectMapper();
try {
Map<?, ?> map = objectMapper.readValue(originalContent, Map.class);
map.remove("companyName");
return objectMapper.writeValueAsBytes(map);
}
catch (IOException ex) {
return originalContent;
}
}
});
}
您最终会得到两个片段目录,一个是命名的company
,一个是命名employee
的。然后,您可以使用response-fields.adoc
每个片段。
虽然上述方法可行,但它比需要的更难。我已经打开了一个问题,以便不再需要修改响应内容的预处理。