Проблема кодирования ответа Spring MVC
В последние несколько часов я много читал по этой теме, и до сих пор ничего не получалось. Я пытаюсь вернуть ответ, содержащий "нечетные" некоторые символы. Вот пример этого, довольно простой:
@ResponseBody
@RequestMapping(value="test")
public String test(){
String test = "čćžđš";
System.out.println(test);
logger.info(test);
return test;
}
Это мой файл web.xml, потому что я нашел ответы на некоторые вопросы, в которых помог CharacterEncodingFilter (но не в моем случае). Я использовал метод POST, потому что я прочитал, что это относится к POST.
Также нашел этот ответ(связанный). Не помогло также.
Когда я отлаживаю его, появляется правильное значение, но когда я печатаю, его нет, как видно ниже:
Когда я проверяю его с помощью Jmeter, ответ, кажется, в порядке, Content-Type
является text/html;charset=UTF-8
Вот скриншот этого также. http://i56.tinypic.com/14lt653.jpg
Я думаю, что правильный путь - вернуть UTF-8, возможно я ошибаюсь.
4 ответа
После нескольких дней этого у меня просто было "кто твой папина момент". Она пришла после прочтения ссылки на Spring 3.0, мне больше нечего было попробовать, так почему бы не просмотреть всю документацию... и комбинацию ответа @axtavt:
Кто устанавливает тип содержимого ответа в Spring MVC (@ResponseBody)
Изменено оригинальное решение:
public class EncodingPostProcessor implements BeanPostProcessor {
public Object postProcessBeforeInitialization(Object bean, String name)
throws BeansException {
if (bean instanceof AnnotationMethodHandlerAdapter) {
HttpMessageConverter<?>[] convs = ((AnnotationMethodHandlerAdapter) bean).getMessageConverters();
for (HttpMessageConverter<?> conv: convs) {
if (conv instanceof StringHttpMessageConverter) {
((StringHttpMessageConverter) conv).setSupportedMediaTypes(
Arrays.asList(new MediaType("text", "html",
Charset.forName("UTF-8"))));
}
}
}
return bean;
}
Кому:
public class EncodingPostProcessor implements BeanPostProcessor {
public Object postProcessBeforeInitialization(Object bean, String name)
throws BeansException {
if (bean instanceof AnnotationMethodHandlerAdapter) {
HttpMessageConverter<?>[] convs = ((AnnotationMethodHandlerAdapter) bean).getMessageConverters();
for (HttpMessageConverter<?> conv: convs) {
if (conv instanceof StringHttpMessageConverter) {
((StringHttpMessageConverter) conv).setSupportedMediaTypes(
Arrays.asList(new MediaType("text", "plain",
Charset.forName("UTF-8"))));
}
}
}
return bean;
}
Чертова весна!!! но все же я буду продолжать использовать его.
Вместо @ResponseBody используйте ResponseEntity.
@RequestMapping(value="test")
public ResponseEntity<String> test(){
String test = "čćžđš";
System.out.println(test);
logger.info(test);
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.add("Content-Type", "application/json; charset=UTF-8");
return ResponseEntity<String>(test,responseHeaders, HttpStatus.OK);
}
Мое простое решение:
@RequestMapping(value="test")
public ModelAndView test(){
String test = "čćžđš";
...
ModelAndView mav = new ModelAndView("html_utf8");
mav.addObject("responseBody", test);
}
и представление html_utf8.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>${responseBody}
Никаких дополнительных классов и настроек.
И Вы также можете создать другое представление (например, json_utf8) для другого типа контента.
Я вижу две проблемы в фактическом доставленном ответе.
Ответ, очевидно, представляет собой просто текст, но ваш заголовок типа содержимого ответа говорит, что это HTML.
Судя по длине содержимого ответа, содержимое фактически не было закодировано в UTF-8.
FWIW - CharacterEncodingFilter
не поможет с вашей проблемой, потому что она имеет дело с кодировкой запроса, а не ответа.
Я думаю, что проблема в том, что вам нужно настроить конвертер сообщений для тела ответа. Тем не менее, похоже, что ваше приложение уже что-то делает в этой области, потому что поведение StringHttpMessageConverter по умолчанию заключается в использовании "text / plain" в качестве типа контента.