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

时间:2016-02-12 09:35:59

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

在我的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

如何正确显示特殊字符?

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

我打电话给prettyPrint()之后就可以了:

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