Проблема кодирования ответа Spring MVC - PullRequest
3 голосов
/ 10 июля 2011

За последние несколько часов я много читал по этой теме, и до сих пор ничего не получалось. Я пытаюсь вернуть ответ, содержащий "нечетные" некоторые символы. Вот пример этого, довольно простой:

@ResponseBody
    @RequestMapping(value="test")
    public String test(){
        String test = "čćžđš";
        System.out.println(test);
        logger.info(test);
        return test;
    }

Это мой web.xml , потому что я нашел несколько ответов, где помог CharacterEncodingFilter (но не в моем случае). Я использовал метод POST, потому что я прочитал, что это относится к POST.

Также нашел этот ответ (связанный). Не помогло.

Когда я отлаживаю его, появляется правильное значение, но когда я его печатаю, это не так, как видно ниже:

enter image description here

Когда я проверяю его с помощью jmeter, ответ вроде бы в порядке, Content-Type равен text/html;charset=UTF-8

Вот скриншот этого тоже. http://i56.tinypic.com/14lt653.jpg

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

Ответы [ 4 ]

1 голос
/ 06 сентября 2016

Вместо @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);
}
1 голос
/ 11 июля 2011

После нескольких дней этого у меня просто было "кто твой папина момент".Он пришел из чтения ссылки на 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;
    }

штопать пружину !!!но я все равно продолжу его использовать.

1 голос
/ 17 июля 2011

Мое простое решение:

@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) для другого типа контента.

0 голосов
/ 10 июля 2011

Я вижу две проблемы в фактическом доставленном ответе.

  • Ответ - это просто текст, но заголовок вашего типа контента говорит, что это HTML.

  • Судя по длине содержимого ответа, содержимое фактически не было закодировано в UTF-8.


FWIW - CharacterEncodingFilter не поможет с вашей проблемой, потому что он имеет дело с кодированием запроса, а не ответа.


Я думаю, что проблема в том, что вам нужно настроить конвертер сообщений для тела ответа. Однако, похоже, что ваше приложение уже что-то делает в этой области, потому что поведение StringHttpMessageConverter по умолчанию заключается в использовании «text / plain» в качестве типа содержимого.

...