Spring MVC响应编码问题

时间:2011-07-09 23:57:00

标签: java servlets spring-mvc character-encoding

在过去几个小时里,我已经阅读了很多关于这个主题的内容,到目前为止还没有任何工作。我正在尝试返回包含“奇数”某些字符的响应。这是一个例子,非常简单:

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

这是我的web.xml,因为我找到了一些CharacterEncodingFilter帮助的答案(尽管不是我的情况)。我使用POST方法,因为我读到这适用于POST。

还找到了这个answer(相关)。没有帮助。

当我调试它时会出现正确的值,但是当我打印它时,它不会如下所示:

enter image description here

当我从jmeter测试时,响应似乎没问题,Content-Typetext/html;charset=UTF-8

以下是该截图。 http://i56.tinypic.com/14lt653.jpg

我认为正确的方法是返回UTF-8,也许我错了。

4 个答案:

答案 0 :(得分:1)

几天后,我就得到了“你爸爸的时刻”。它来自阅读Spring 3.0参考,我没有别的尝试,所以为什么不通过整个文档...和@axtavt的组合回答:

Who sets response content-type in 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;
    }

Darn spring !!!但我仍然会继续使用它。

答案 1 :(得分:1)

我的简单解决方案:

@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)。

答案 2 :(得分:1)

而是@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);
}

答案 3 :(得分:0)

我可以在实际提供的回复中看到两个问题。

  • 响应显然只是文本,但您的响应内容类型标题是说它是HTML。

  • 根据回复的内容长度判断,内容实际上并未以UTF-8编码。


FWIW - CharacterEncodingFilter无法解决您的问题,因为它正在处理请求的编码而不是响应。


我认为问题在于您需要为响应正文配置消息转换器。但是,您的应用程序似乎已在此区域执行某些操作,因为StringHttpMessageConverter的默认行为是使用“text / plain”作为其内容类型。

相关问题