У меня есть управляемое аннотациями веб-приложение Spring MVC Java, запущенное на веб-сервере причала (в настоящее время в плагине maven jetty).
Я пытаюсь реализовать некоторую поддержку AJAX с помощью одного метода контроллера, возвращающего только текст справки String. Ресурсы находятся в кодировке UTF-8, как и строка, но мой ответ с сервера идет с
content-encoding: text/plain;charset=ISO-8859-1
даже когда мой браузер отправляет
Accept-Charset windows-1250,utf-8;q=0.7,*;q=0.7
Я как-то использую конфигурацию Spring по умолчанию
Я нашел подсказку добавить этот bean-компонент в конфигурацию, но я думаю, что он просто не используется, потому что он говорит, что не поддерживает кодировку, а вместо нее используется кодировка по умолчанию.
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes" value="text/plain;charset=UTF-8" />
</bean>
Мой код контроллера (обратите внимание, что это изменение типа ответа у меня не работает):
@RequestMapping(value = "ajax/gethelp")
public @ResponseBody String handleGetHelp(Locale loc, String code, HttpServletResponse response) {
log.debug("Getting help for code: " + code);
response.setContentType("text/plain;charset=UTF-8");
String help = messageSource.getMessage(code, null, loc);
log.debug("Help is: " + help);
return help;
}
DispatcherServlet
's config (...-servlet.xml
)Я нашел решение для Spring 3.1. с использованием аннотации @ResponseBody. Вот пример контроллера, использующего вывод Json:
источник
<mvc:annotation-driven/>
в applicationContext. (Вместо того<bean class=" [...] DefaultAnnotationHandlerMapping"/>
, что в любом случае устарело в Spring 3.2 ...)produces
атрибута.MediaType.APPLICATION_JSON_UTF8_VALUE
..Обратите внимание, что в Spring MVC 3.1 вы можете использовать пространство имен MVC для настройки конвертеров сообщений:
Или конфигурация на основе кода:
источник
Accept-Charset
заголовком, который, вероятно, перечисляет все известные кодировки символов, и 2) когда запрос имеетAccept
заголовок,supportedMediaTypes
свойство конвертера не используется , поэтому, например, когда я делаю запрос, набирая непосредственно URL-адрес в браузере,Content-Type: text/html
вместо этого ответ имеет заголовок.<bean class="org.springframework.http.converter.StringHttpMessageConverter"><constructor-arg value="UTF-8" /></bean>
На всякий случай также можно задать кодировку следующим образом:
Я думаю, что использовать StringHttpMessageConverter лучше, чем это.
источник
the manifest may not be valid or the file could not be opened.
в IE 11. Спасибо, digz!в RequestMapping можно добавить productions = "text / plain; charset = UTF-8"
см. этот блог для более подробной информации
источник
Недавно я боролся с этой проблемой и нашел гораздо лучший ответ, доступный в Spring 3.1:
Итак, так же просто, как JAX-RS, как и все комментарии, которые указывали, что это может / должно быть.
источник
produces
говорит: «... запрос отображается, только если Content-Type соответствует одному из этих типов мультимедиа». это означает, что AFAIKproduces
имеет отношение к тому, соответствует ли метод запросу, а не к тому, какой тип содержимого должен иметь ответ.Вы можете использовать производит, чтобы указать тип ответа, который вы отправляете от контроллера. Это ключевое слово "производит" будет наиболее полезно в запросе ajax и очень помогло в моем проекте.
источник
Спасибо digz6666, ваше решение работает для меня с небольшими изменениями, потому что я использую json:
Ответ, данный axtavt (который вы рекомендовали), не сработает для меня. Даже если я добавил правильный тип носителя:
источник
Я установил тип содержимого в MarshallingView в компоненте ContentNegotiatingViewResolver . Работает легко, чисто и плавно:
источник
Я использую CharacterEncodingFilter, настроенный в web.xml. Может, это поможет.
источник
forceEncoding=true
Он тоже фильтрует ответ, но в данном случае это не поможет.forceEncoding=false
. Я просто установил его,false
и "charset = UTF-8" успешно добавлен вContent-Type
заголовок.если ничего из вышеперечисленного не сработало, вы попытаетесь сделать запросы ajax на «POST», а не на «GET», это сработало для меня хорошо ... ничего из вышеперечисленного не сделал. Еще у меня есть characterEncodingFilter.
источник
После того, как я попробовал много способов решения этой проблемы ... Я подумал об этом, и он отлично работает.
источник
Простой способ решить эту проблему в Spring 3.1.1: добавить следующие коды конфигурации в
servlet-context.xml
Не нужно ничего переопределять или реализовывать.
источник
если вы решите решить эту проблему с помощью следующей конфигурации:
вы должны подтвердить, что во всем вашем файле * .xml должен быть только один тег mvc: annotation. в противном случае конфигурация может оказаться неэффективной.
источник
Согласно ссылке «Если кодировка символов не указана, спецификация сервлета требует, чтобы использовалась кодировка ISO-8859-1». Если вы используете Spring 3.1 или более позднюю версию, используйте следующую конфигурацию, чтобы установить charset = UTF-8 на тело ответа
@RequestMapping (value = "ваш URL-адрес отображения", производит = "text / plain; charset = UTF-8")
источник
Пример конфигурации:
источник