【问题标题】:How to format Spring REST Docs in response body with mockMvc如何使用 mockMvc 在响应正文中格式化 Spring REST Docs
【发布时间】:2019-01-31 05:01:32
【问题描述】:

我使用 Spring REST Docs 编写我的 API 文档。

代码示例:

@Override
public void getById(String urlTemplate, PathParametersSnippet pathParametersSnippet, Object... urlVariables) throws Exception {
    resultActions = mockMvc.perform(get(urlTemplate, urlVariables)
            .principal(principal)
            .contentType(APPLICATION_JSON))
            .andExpect(status().isOk())
            .andDo(print());

    // do..
}

但问题是测试的结果是一行回答的。而且理解返回数据的结构非常困难。

响应示例:

MockHttpServletResponse:
           Status = 200
    Error message = null
          Headers = {Content-Type=[application/json;charset=UTF-8]}
     Content type = application/json;charset=UTF-8
             Body = {"creator":null,"modifier":null,"modificationTime":null,"creationTime":null,"id":100,"deleted":false,"name":"Name","description":null,"report":[{"creator":"System","modifier":"System","modificationTime":"2019-01-30T14:21:50","creationTime":"2019-01-30T14:21:50","id":1,"name":"Form name","reportType":{"creator":"System","modifier":"System","modificationTime":"2019-01-30T14:21:50","creationTime":"2019-01-30T14:21:50","id":1,"deleted":false,"name":"Raport"},"unmodifiable":true}]}
    Forwarded URL = null
   Redirected URL = null
          Cookies = []

此外,我根据收到的答案生成文档,并且在文档中还包含未格式化的 JSON

我做错了什么?如何为json启用格式化?

【问题讨论】:

    标签: java spring spring-mvc-test spring-restdocs


    【解决方案1】:

    如果您无法将应用程序配置为生成打印精美的响应,则可以在记录它们之前让 REST 文档为您完成此操作。这在文档的Customizing Requests and Responses 部分进行了描述:

    通过使用OperationRequestPreprocessor 和/或OperationResponsePreprocessor 调用文档来配置预处理。可以使用Preprocessors 上的静态preprocessRequestpreprocessResponse 方法获取实例。例如:

    this.mockMvc.perform(get("/")).andExpect(status().isOk())
        .andDo(document("index", preprocessRequest(removeHeaders("Foo")), 
                preprocessResponse(prettyPrint()))); 
    

    在上述情况下,请求正在被预处理以删除 Foo 标头,并且响应正在被预处理以使其看起来打印得很好。

    【讨论】:

    • 感谢您的回答。没想到图书馆的作者会回复我,谢谢:)
    【解决方案2】:

    您可以尝试从 mockMvc 获取 ResultActions 对象,而不是获取 MockHttpServletResponse 对象。之后,您可以获得响应的字段的所有值。在这种情况下,您不需要解析字符串。

    resultActions = mockMvc.perform(get(urlTemplate, urlVariables)
        .principal(principal)
        .contentType(APPLICATION_JSON))
        .andExpect(status().isOk())
        .andDo(print());
    
    MockHttpServletResponse content = resultActions.andReturn().getResponse();
    

    您还可以将MockHttpServletResponse 对象数据转换为 json。如果您使用 Jacson,则为该对象编写自定义序列化程序,请将其添加到 MockHttpServletResponse 并在 ObjectMapper 中注册。

    ObjectMapper mapper = new ObjectMapper();
    SimpleModule module = new SimpleModule();
    module.addSerializer(MockHttpServletResponse.class, CustomSerializer.class);
    mapper.registerModule(module);
    String jsonResult = mapper.writeValueAsString(content);
    

    CustomSerializer 应该扩展 StdSerializer<MockHttpServletResponse> 并覆盖 serialize 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-15
      • 1970-01-01
      • 2015-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-22
      相关资源
      最近更新 更多