在过去几个小时里,我已经阅读了很多关于这个主题的内容,到目前为止还没有任何工作。我正在尝试返回包含“奇数”某些字符的响应。这是一个例子,非常简单:
@ResponseBody
@RequestMapping(value="test")
public String test(){
String test = "čćžđš";
System.out.println(test);
logger.info(test);
return test;
}
这是我的web.xml,因为我找到了一些CharacterEncodingFilter帮助的答案(尽管不是我的情况)。我使用POST方法,因为我读到这适用于POST。
还找到了这个answer(相关)。没有帮助。
当我调试它时会出现正确的值,但是当我打印它时,它不会如下所示:
当我从jmeter测试时,响应似乎没问题,Content-Type
是text/html;charset=UTF-8
以下是该截图。 http://i56.tinypic.com/14lt653.jpg
我认为正确的方法是返回UTF-8,也许我错了。
答案 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”作为其内容类型。