如何将对象的响应字段记录为Map(HashMap)

时间:2016-05-25 08:58:34

标签: spring-restdocs

我正在为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");
 }

正如您所看到的,响应字段的代码已被注释掉,因为我还没有任何解决方案。我正在努力,但我非常感谢你的帮助。提前谢谢。

2 个答案:

答案 0 :(得分:3)

您的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 :(得分:0)

有两种选择:

1&GT;将MAP更改为对象的LIST,以便可以轻松描述响应字段。

2 - ;手动将描述放到index.adoc文件中。

在我的情况下,我选择2,因为我必须坚持使用MAP。