我正在使用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方法在
root
@Controller public class RootController { @RequestMapping(value="/"/*, produces="text/plain;charset=UTF-8"*/) @ResponseBody public String root() { return "æøå"; } }
æøå除非我取消注释该produces部分,否则它会以ISO-8859-1(而不是UTF-8)的形式响应字符串,在这种情况下,它实际上返回UTF-8。消息转换器在这里似乎没有任何作用。
æøå
produces
按照这种方法,我确认该bean实际上已经被注册。除了这个bean外,我还注册了另一个问题中所述的EmbeddedServletContainerFactory和,尽管我认为这与这里无关。CharacterEncodingFilter
EmbeddedServletContainerFactory
CharacterEncodingFilter
有人可以解释注册的HttpMessageConverter实际作用,以及如何使带@ResponseBody注释的控制器方法无需produces每次都提供UTF-8 吗?
HttpMessageConverter
@ResponseBody
编辑
正如在评论中讨论的,接受的答案工作,我不得不升级春天启动的版本0.5.0.M6来0.5.0.BUILD- SNAPSHOT,并防止输出垃圾头,通话converter.setWriteAcceptCharset(false)上StringHttpMessageConverter。
0.5.0.M6
0.5.0.BUILD- SNAPSHOT
converter.setWriteAcceptCharset(false)
StringHttpMessageConverter
的默认字符集StringHttpMessageConverter是ISO-8859-1。这意味着当客户端不请求特定的字符集时,ISO-8859-1将返回该字符集。
ISO-8859-1
如果要UTF-8成为默认字符集,则将其传递给构造函数:
UTF-8
converter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
setSupportedMediaTypes()这样就不再需要text/plain; charset=default character set自动添加的呼叫。
setSupportedMediaTypes()
text/plain; charset=default character set