我正在使用 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 之外,我还注册了一个EmbeddedServletContainerFactory
and CharacterEncodingFilter
,如另一个问题中所述,尽管我认为这与这里无关。
有人可以解释注册的HttpMessageConverter
实际作用,以及如何使@ResponseBody
-annotated 控制器方法返回 UTF-8 而不必produces
每次都提供?
编辑
正如评论中所讨论的那样,为了使接受的答案起作用,我必须将 Spring Boot 的版本从升级0.5.0.M6
到 ,0.5.0.BUILD-SNAPSHOT
并且为了防止输出垃圾标头,请调用converter.setWriteAcceptCharset(false)
.StringHttpMessageConverter