Make @ ResponseBody-annotated Spring(Boot)MVC控制器方法返回UTF-8

时间:2014-01-05 16:24:11

标签: spring spring-mvc utf-8 spring-boot

我正在使用Spring Boot构建Spring MVC服务,并希望能够将字符串作为以UTF-8编码的纯文本返回。在this description之后,我认为唯一必要的是添加bean方法

@Bean
public HttpMessageConverter<String> responseBodyConverter() {
    StringHttpMessageConverter converter = new StringHttpMessageConverter();
    converter.setSupportedMediaTypes(Arrays.asList(new MediaType("text", "plain", Charset.forName("UTF-8"))));
    return converter;
}

但是

中的root方法
@Controller
public class RootController {

    @RequestMapping(value="/"/*, produces="text/plain;charset=UTF-8"*/)
    @ResponseBody
    public String root() {
        return "æøå";
    }

}

响应ISO-8859-1中的字符串æøå而不是UTF-8,除非我取消注释produces部分,在这种情况下它实际上返回UTF-8。消息转换器似乎没有任何效果。

关注this approach我确认该bean实际上已经注册。除了这个bean之外,我还注册EmbeddedServletContainerFactoryCharacterEncodingFilter,如another question中所述,尽管我认为这与此无关。

有人可以解释注册的HttpMessageConverter实际上做了什么,以及如何使@ResponseBody - 带注释的控制器方法返回UTF-8而不必每次都提供produces吗?

修改

正如评论中所讨论的,对于已接受的工作答案,我必须将Spring Boot的版本从0.5.0.M6升级到0.5.0.BUILD-SNAPSHOT,并且为了防止输出垃圾头,请调用{{1在converter.setWriteAcceptCharset(false)

1 个答案:

答案 0 :(得分:1)

StringHttpMessageConverter的默认字符集为ISO-8859-1。这意味着当客户端不请求特定字符集时,将返回ISO-8859-1

如果您希望UTF-8成为默认字符集,则将其传递给构造函数:

converter = new StringHttpMessageConverter(Charset.forName("UTF-8"));

当自动添加setSupportedMediaTypes()时,不再需要调用text/plain; charset=default character set