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,也许我错了。
几天之后,我就有了“谁是你爸爸的时刻”。 它来自阅读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; }
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”作为其内容类型。