MockMvc больше не обрабатывает символы UTF-8 с Spring Boot 2.2.0.RELEASE - PullRequest
2 голосов
/ 23 октября 2019

После обновления до недавно выпущенной 2.2.0.RELEASE версии Spring Boot некоторые из моих тестов не прошли. Похоже, что 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."}]

Как я могу получить content в кодировке UTF-8?

Ответы [ 2 ]

1 голос
/ 23 октября 2019

Использование .getContentAsString(StandardCharsets.UTF_8) вместо .getContentAsString() решает проблему.

0 голосов
/ 12 ноября 2019

Да. Это проблема с 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));
    }
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...