如何将对象的响应字段记录为 Map(HashMap)
How to document response fields for an object as Map(HashMap)
我正在为返回如下对象的 REST 服务编写文档:
Map<String, HashMap<Long, String>>
而且我找不到描述此类对象的响应字段的方法。
让我们看看我的代码。
服务:
@RequestMapping(value = "/data", method = RequestMethod.GET)
public Map<String, HashMap<Long, String>> getData()
{
Map<String, HashMap<Long, String>> list = dao.getData();
return list;
}
我的基于单元测试的文档:
@Test
public void testData() throws Exception
{
TestUtils.beginTestLog(log, "testData");
RestDocumentationResultHandler document = document(SNIPPET_NAME_PATTERN ,preprocessResponse(prettyPrint()));
document.snippets(
// ,responseFields(
// fieldWithPath("key").description("key description").type("String"),
// fieldWithPath("value").description("value as a Hashmap").type("String"),
// fieldWithPath("value.key").description("value.key description").type("String"),
// fieldWithPath("value.value").description("value.value description").type("String"),
// )
String token = TestUtils.performLogin(mockMvc, "user", "password");
mockMvc
.perform(get(APP_BUILD_NAME + "/svc/data").contextPath(APP_BUILD_NAME)
.header("TOKEN", token)
)
.andExpect(status().is(200))
.andExpect(content().contentType("application/json;charset=UTF-8"))
.andExpect(jsonPath("$").isMap())
.andDo(document);
TestUtils.endTestLog(log, "testData");
}
如您所见,响应字段的代码已被注释掉,因为我还没有找到任何解决方案。我正在努力,但我真的很感谢你的帮助。提前谢谢你。
您的 JSON 包含大量不同的字段。地图中看起来有超过 1000 个不同的条目。这些条目中的每一个本身都是具有单个键值对的映射。这些键似乎也各不相同。潜在地,这为您提供了超过 2000 个字段来记录:
cancel
cancel.56284
year
year.41685
segment_de_clientele
segment_de_clientele.120705
…
这种结构使其难以记录,同时也是客户难以使用的有力指标。理想情况下,您将重组 JSON 以便每个条目都具有相同的键,并且只是值因条目而异。像这样的东西,例如:
{
"translations": [ {
"name": "cancel",
"id": 56284,
"text": "Exit"
}, {
"name": "year",
"id": 41685,
"text": "Year"
}, {
"name": "segment_de_clientele",
"id": 120705,
"text": "Client segment"
}]
}
这意味着您只有少数几个字段需要记录:
translations[]
translations[].name
translations[].id
translations[].text
如果那不可能,那么我将停止尝试使用响应字段片段来记录响应的结构。相反,您应该在主 Asciidoctor 源文件中手动描述其结构。
有两种选择:
1> 将对象的 MAP 更改为 LIST,以便可以轻松描述响应字段。
2> 手动将描述放入 index.adoc 文件。
就我而言,我选择选项 2,因为我必须坚持使用 MAP。
我正在为返回如下对象的 REST 服务编写文档:
Map<String, HashMap<Long, String>>
而且我找不到描述此类对象的响应字段的方法。
让我们看看我的代码。
服务:
@RequestMapping(value = "/data", method = RequestMethod.GET)
public Map<String, HashMap<Long, String>> getData()
{
Map<String, HashMap<Long, String>> list = dao.getData();
return list;
}
我的基于单元测试的文档:
@Test
public void testData() throws Exception
{
TestUtils.beginTestLog(log, "testData");
RestDocumentationResultHandler document = document(SNIPPET_NAME_PATTERN ,preprocessResponse(prettyPrint()));
document.snippets(
// ,responseFields(
// fieldWithPath("key").description("key description").type("String"),
// fieldWithPath("value").description("value as a Hashmap").type("String"),
// fieldWithPath("value.key").description("value.key description").type("String"),
// fieldWithPath("value.value").description("value.value description").type("String"),
// )
String token = TestUtils.performLogin(mockMvc, "user", "password");
mockMvc
.perform(get(APP_BUILD_NAME + "/svc/data").contextPath(APP_BUILD_NAME)
.header("TOKEN", token)
)
.andExpect(status().is(200))
.andExpect(content().contentType("application/json;charset=UTF-8"))
.andExpect(jsonPath("$").isMap())
.andDo(document);
TestUtils.endTestLog(log, "testData");
}
如您所见,响应字段的代码已被注释掉,因为我还没有找到任何解决方案。我正在努力,但我真的很感谢你的帮助。提前谢谢你。
您的 JSON 包含大量不同的字段。地图中看起来有超过 1000 个不同的条目。这些条目中的每一个本身都是具有单个键值对的映射。这些键似乎也各不相同。潜在地,这为您提供了超过 2000 个字段来记录:
cancel
cancel.56284
year
year.41685
segment_de_clientele
segment_de_clientele.120705
…
这种结构使其难以记录,同时也是客户难以使用的有力指标。理想情况下,您将重组 JSON 以便每个条目都具有相同的键,并且只是值因条目而异。像这样的东西,例如:
{
"translations": [ {
"name": "cancel",
"id": 56284,
"text": "Exit"
}, {
"name": "year",
"id": 41685,
"text": "Year"
}, {
"name": "segment_de_clientele",
"id": 120705,
"text": "Client segment"
}]
}
这意味着您只有少数几个字段需要记录:
translations[]
translations[].name
translations[].id
translations[].text
如果那不可能,那么我将停止尝试使用响应字段片段来记录响应的结构。相反,您应该在主 Asciidoctor 源文件中手动描述其结构。
有两种选择:
1> 将对象的 MAP 更改为 LIST,以便可以轻松描述响应字段。
2> 手动将描述放入 index.adoc 文件。
就我而言,我选择选项 2,因为我必须坚持使用 MAP。