@ResponseBody и язык приводят к неправильной кодировке

У меня есть несколько конечных точек REST, которые возвращают объекты JSON. Для большинства языков ответы верны (все символы правильно отображаются в ответе, а Content-Type - application / json).

Если я предоставлю заголовок Accept-Language со значением «en_NL», заголовок Content-Type изменится на «application / json; charset = ISO-8859-1». Тело ответа также содержит неправильные закодированные символы. (Например, € превращается в â ‚¬).

Я не уверен, где изменяется заголовок типа содержимого, и я не могу найти никаких следов ни в одном фильтре / конфигурации или jaxb.

Для (не) маршаллинга я использую jaxb. Приложение создано с использованием Spring 4.1.7 и размещено на сервере tomcat.

Пример контроллера:

    @RequestMapping(value = "/by-bundle", method = RequestMethod.GET)
    @ResponseBody
    public SbMessageMap getByBundleCodes(final @RequestParam("groups") String[] groups) {
        // return json object here
    }

Заранее спасибо!

Я не очень хорошо знаю Spring, но вместо того, чтобы отслеживать, как определяется кодировка, вы могли бы просто установить для нее фиксированное значение, такое как UTF-8.

Thomas 18.12.2018 18:39

Я могу добавить тип контента в фильтр, но это было бы грязным решением.

Cornel Janssen 18.12.2018 18:53

Что ж, я бы сказал, что если служба создает сообщения в кодировке UTF-8, то на самом деле было бы более чистым решением явно заявить об этом.

Thomas 19.12.2018 09:35
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
150
1

Ответы 1

Вы пытались установить кодировку с параметром productions в @RequestMapping?

@RequestMapping(value = "/by-bundle", method = RequestMethod.GET, produces = "application/json; charset=UTF-8")

Я бы предпочел не настраивать все конечные точки, которые в настоящее время доступны в проекте. Спасибо за ответ!

Cornel Janssen 18.12.2018 18:53

@CornelJanssen Вместо этого вы можете добавить кодировку в bean-компонент или конфигурацию, чтобы вам не пришлось изменять все конечные точки. См. stackoverflow.com/a/9394539/4614788, stackoverflow.com/a/51474450/4614788 и stackoverflow.com/a/39913506/4614788.

Glenn Van Schil 19.12.2018 10:03

Другие вопросы по теме