Spring REST 文档:特殊字符未正确显示

Spring REST Docs: special characters are not shown correctly

在我的 Spring MVC 测试(UTF-8 编码)中,我们发现:

this.mockMvc = MockMvcBuilders.webAppContextSetup(context).apply(springSecurity())
        .apply(documentationConfiguration(restDocumentation)
    .snippets().withEncoding("UTF-8")) // default
    .build();
...
myRequestDTO.setValue("Größe");
ResultActions action = this.mockMvc
    .perform(post("/my-service")
    .content(jacksonObjectMapper.writeValueAsString(myRequestDTO))
...
action.andDo(document("docs"));

asciidoctor 文件包含

HTTP Request
include::{snippets}/docs/http-request.adoc[]

在我渲染它并在我的 firefox 浏览器中打开生成的 HTML 文件(也是 UTF-8 编码)后,我发现

HTTP Request

POST /my-service HTTP/1.1
...
Größe

如何正确显示特殊字符?

在我调用 prettyPrint() 之后它起作用了:

action.andDo(document("docs", 
    preprocessRequest(prettyPrint()),
    preprocessResponse(prettyPrint())));

这里的根本问题是将请求的内容作为 byte[] 转换为字符串。 Spring REST Docs 使用 Content-Type header 的 charset 属性来确定在创建 String 时应使用的 Charset。如果没有 Content-Type header 或其值没有 charset 属性,则使用 JVM 的默认值 Charset(作为调用 new String(bytes) 的结果) .

有两种方法可以避免特殊字符损坏:

  1. 在请求的 Content-Type header 中指定字符集属性。例如,使用 text/plain;charset=UTF-8 而不是 text/plain
  2. 通过设置 file.encoding 系统 属性 配置 JVM 的默认值 Charset-Dfile.encoding=UTF8,例如