在升级到新发布的Spring Boot的2.2.0.RELEASE版本后,我的一些测试失败了。看来MediaType.APPLICATION_JSON_UTF8已被弃用,并且不再从未显式指定内容类型的控制器方法中作为默认内容类型返回。

测试代码如

String content = mockMvc.perform(get("/some-api")
            .contentType(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk())
            .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
            .andReturn()
            .getResponse()
            .getContentAsString();


突然不再工作了,因为内容类型不匹配,如下所示

java.lang.AssertionError: Content type
Expected :application/json;charset=UTF-8
Actual   :application/json


将代码更改为.andExpect(content().contentType(MediaType.APPLICATION_JSON))暂时解决了该问题。

但是现在,将content与预期的序列化对象进行比较时,如果对象中有任何特殊字符,则仍然不匹配。似乎.getContentAsString()方法默认情况下(不再)不使用UTF-8字符编码。

java.lang.AssertionError: Response content expected:<[{"description":"Er hörte leise Schritte hinter sich."}]> but was:<[{"description":"Er hörte leise Schritte hinter sich."}]>
Expected :[{"description":"Er hörte leise Schritte hinter sich."}]
Actual   :[{"description":"Er hörte leise Schritte hinter sich."}]


如何获得UTF-8编码的content

最佳答案

是。这是从2.2.0 spring-boot起的问题。他们为默认字符集编码设置了弃用。

.getContentAsString(StandardCharsets.UTF_8)-很好,但是默认情况下会以任何方式填充ISO 8859-1。

在我的项目中,我更新了当前创建的转换器:

@Configuration
public class SpringConfig implements WebMvcConfigurer {

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.stream()
            .filter(converter -> converter instanceof MappingJackson2HttpMessageConverter)
            .findFirst()
            .ifPresent(converter -> ((MappingJackson2HttpMessageConverter) converter).setDefaultCharset(UTF_8));
    }
...

10-06 09:52