Кодировка ResponseBody

98
25 марта 2021, 15:30

@ResponseBody при формировании ответа использует StringHttpMessageConverter(исправьте, если не прав). И у него по-умолчанию кодировка ISO-8859-1. Соответственно, чтобы клиент мог принять ответ в кодировке utf-8, недостаточно просто поставить фильтр, который бы устанавливал кодировку ответа(ResponseBody перезаписывает ее на свою дефолтную). Я вижу три варианта:

1) Самый прямолинейный: просто указать кодировку с помощью produces в @RequestMapping. Этот способ не нравится, потому что все ответы должны быть в utf-8, а значит ее надо будет указывать вручную на все обрабочтики с аннотацией @ResponseBody

2) Изменить дефолтную кодировку mvc контекста на этапе инициализации:

@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
for (HttpMessageConverter converter : converters) {
    if (converter instanceof StringHttpMessageConverter) {
        ((StringHttpMessageConverter) converter).setDefaultCharset(Charset.forName("UTF-8"));
    }
}

Хотя это делает то, что мне нужно, я не до конца понимаю, как это может повлиять на работу фреймворка. Не сломаю ли я таким образом что-нибудь. Да и cast вверх выглядит некрасиво

3) Этот способ еще не пробовал, но думаю, такое возможно: установить HandlerInterceptor (или аспект), который бы конвертировал ответ от обработчиков в utf-8, если кодировка ответа другая. Покрывает минусы первого и второго способов, но производит нагрузку, будучи лишним этапом между сервером и клиентом.

Изучая спринг до этого, мне начало казаться, что он способен предоставить решение для любой не касающейся бизнес-логики задачи. Но тут кажется, что это не предусмотрено. Или я плохо искал? Есть варант по-лучше, и если нет, какой лучший из описанных?

Answer 1

Вы можете просто объявить тот же самый StringHttpMessageConverter в своей конфигурации с нужной Вам кодировкой. Один из конструкторов StringHttpMessageConverter принимает параметр Charset defaultCharset. Объявляете бин с типом HttpMessageConverter и возвращаете new StringHttpMessageConverter(StandardCharsets.UTF_8). Либо используете любой другой удобный конвертер.

Spring Boot автоматически конфигурирует StringHttpMessageConverter с кодировкой UTF-8

READ ALSO
Какой запрос использовать в Rest Api?

Какой запрос использовать в Rest Api?

Всем приветХотелось бы узнать, можно ли при работе с Rest Api всегда использовать только POST заголовки? Или это моветон? Согласно CRUD, на каждую...

101
Передача русских символов в качестве аргументов java

Передача русских символов в качестве аргументов java

При вызове java-программы из командной строки с аргументами в качестве русских символов эти аргументы не распознаются программойЧто можно...

114
Не открывается подменю при нажатии пункта главного меню

Не открывается подменю при нажатии пункта главного меню

Я использовал библиотеку AndroidX Preference для своего проектаЭтот проект имеет главное меню и подменю

121
Отправка файла на веб сервис через java servlets

Отправка файла на веб сервис через java servlets

Есть веб форма, в которой есть возможность отправки файла на сервер на сервлетах javaНе могу сообразить, как мне организовать принятие файла...

99