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-Typetext/html;charset=UTF-8

这是一个截图。 http://i56.tinypic.com/14lt653.jpg

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

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

谁在S​​pring 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 !!! 但我仍然会继续使用它。

我的简单方案:

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

而@ResponseBody使用ResponseEntity。

 @RequestMapping(value="test") public ResponseEntity 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(test,responseHeaders, HttpStatus.OK); } 

我可以在实际交付的响应中看到两个问题。

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

  • 从响应的内容长度来看,内容实际上并未以UTF-8编码。


FWIW – CharacterEncodingFilter对你的问题没有帮助,因为它处理请求的编码而不是响应。


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