Проблема кодирования ответа 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" в качестве типа контента.

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