小编典典

使@ResponseBody注释的Spring(Boot)MVC控制器方法返回UTF-8

spring-boot

我正在使用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 "æøå";
    }

}

æøå除非我取消注释该produces部分,否则它会以ISO-8859-1(而不是UTF-8)的形式响应字符串,在这种情况下,它实际上返回UTF-8。消息转换器在这里似乎没有任何作用。

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

有人可以解释注册的HttpMessageConverter实际作用,以及如何使带@ResponseBody注释的控制器方法无需produces每次都提供UTF-8
吗?

编辑

正如在评论中讨论的,接受的答案工作,我不得不升级春天启动的版本0.5.0.M60.5.0.BUILD- SNAPSHOT,并防止输出垃圾头,通话converter.setWriteAcceptCharset(false)StringHttpMessageConverter


阅读 373

收藏
2020-05-30

共1个答案

小编典典

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

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

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

setSupportedMediaTypes()这样就不再需要text/plain; charset=default character set自动添加的呼叫。

2020-05-30