在我的REST控制器中,我使用@PostMapping
、@GetMapping
等注解而没有任何其他规定。
因此,默认情况下应该是JSON
,例如对于@GetMapping
。另外,没有指定字符编码,我认为它必须是UTF-8
,我在文档中找不到默认字符编码。
然而,在我的测试中,我使用MockMvc
。POST
请求如下所示:
public static MvcResult performPost(MockMvc mockMvc, String endpoint, String payload, ResultMatcher status) throws Exception {
MvcResult mvcResult = mockMvc.perform(
post(endpoint)
.content(payload)
.contentType(MediaType.APPLICATION_JSON_VALUE))
.andDo(print())
.andExpect(status)
.andReturn();
return mvcResult;
}
问题:
.andDo(print())
部分似乎没有使用 UTF-8
。如何解决?一些像德语中的 'ü'
这样的字符在我的 NetBeans IDE 控制台中打印不正确。它看起来像 (见 Body):
MockHttpServletResponse:
Status = 200
Error message = null
Headers = [Content-Type:"application/json", X-Content-Type-Options:"nosniff", X-XSS-Protection:"1; mode=block", Cache-Control:"no-cache, no-store, max-age=0, must-revalidate", Pragma:"no-cache", Expires:"0", X-Frame-Options:"DENY"]
Content type = application/json
Body = {"Tür"}
Forwarded URL = null
Redirected URL = null
Cookies = []
问题:
当我的方法返回MvcResult
时,我可以做什么:
MockHttpServletResponse response = mvcResult.getResponse();
ObjectMapper objectMapper = new ObjectMapper();
String contentAsString = response.getContentAsString(StandardCharsets.UTF_8);
我发现,我必须使用StandardCharset.UTF_8
才能获得正确的字符,比如'ü'
。
但是,为什么在MockHttpServletResponse响应
中,characterEncoding ISO-8859-1
?ISO-8859-1
从何而来,它在哪里设置?能否将其更改为UTF-8
?
当我尝试使用以下代码:
String contentAsString = response.getContentAsString(StandardCharsets.ISO_8859_1);
我不理解德语中的 'ü'
,字符串的值为 "Tür"
。尽管根据https://en.wikipedia.org/wiki/ISO/IEC_8859-1上的 Code page layout table,在ISO_8859_1
中字符 'ü'
是存在的。