我正在使用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之外,我还注册EmbeddedServletContainerFactory
和CharacterEncodingFilter
,如another question中所述,尽管我认为这与此无关。
有人可以解释注册的HttpMessageConverter
实际上做了什么,以及如何使@ResponseBody
- 带注释的控制器方法返回UTF-8而不必每次都提供produces
吗?
修改
正如评论中所讨论的,对于已接受的工作答案,我必须将Spring Boot的版本从0.5.0.M6
升级到0.5.0.BUILD-SNAPSHOT
,并且为了防止输出垃圾头,请调用{{1在converter.setWriteAcceptCharset(false)
。
答案 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
。