2011-07-09 56 views
3

在过去的几个小时里,我阅读了很多关于这个主题的内容,到目前为止没有任何工作。我试图返回包含“奇怪”一些字符的回复。这里是举例说,很简单: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。

也发现这个answer(相关)。没有帮助。

当我调试它出现在正确的值,但是当我打印出来没有,因为它可以在下面看到:

enter image description here

当我测试它的JMeter的反应似乎是OK ,Content-Typetext/html;charset=UTF-8

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

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

回答

1

几天后,我只是“谁是你的爸爸时刻”。它来自阅读春天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; 
    } 

该死的春天!!!但我仍然会继续使用它。

0

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

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

  • 从响应的内容长度判断,内容实际上没有用UTF-8编码。


FWIW - 在CharacterEncodingFilter不会与您的问题提供帮助,因为它在处理该请求没有响应的编码。


我认为问题在于您需要为响应主体配置消息转换器。但是,看起来您的应用程序已经在这方面做了一些工作,因为StringHttpMessageConverter的默认行为是使用“text/plain”作为其内容类型。

+0

谢谢,你的回答也让我思考,并最终解决。 – ant

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

+0

thansk但我不使用此服务在最后生成HTML。我从android手机中使用它,发送它作为纯文本json字符串 – ant

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); 
} 
+0

伟大的答案!非常感谢你的工作! – user648026