2

我正在使用 Spring Boot 构建 Spring MVC 服务,并希望能够以 UTF-8 编码的纯文本形式返回字符串。按照这个描述,我认为唯一需要做的就是添加 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。消息转换器在这里似乎没有任何作用。

按照这种方法,我确认该 bean 已实际注册。除了这个 bean 之外,我还注册了一个EmbeddedServletContainerFactoryand CharacterEncodingFilter,如另一个问题中所述,尽管我认为这与这里无关。

有人可以解释注册的HttpMessageConverter实际作用,以及如何使@ResponseBody-annotated 控制器方法返回 UTF-8 而不必produces每次都提供?

编辑

正如评论中所讨论的那样,为了使接受的答案起作用,我必须将 Spring Boot 的版本从升级0.5.0.M6到 ,0.5.0.BUILD-SNAPSHOT并且为了防止输出垃圾标头,请调用converter.setWriteAcceptCharset(false).StringHttpMessageConverter

4

1 回答 1

1

The default character set for the StringHttpMessageConverteris ISO-8859-1. That means when a client does not request a specific character set, then ISO-8859-1 will be returned.

If you want UTF-8to be the default character set then you pass it into the constructor:

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

Calling setSupportedMediaTypes() is then no longer necessary either as text/plain; charset=default character set is added automatically.

于 2014-01-05T17:54:37.557 回答