【问题标题】:Make @ResponseBody-annotated Spring (Boot) MVC controller methods return UTF-8使 @ResponseBody 注释的 Spring (Boot) MVC 控制器方法返回 UTF-8
【发布时间】:2014-01-23 00:44:10
【问题描述】:

我正在使用 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,我还注册了EmbeddedServletContainerFactoryCharacterEncodingFilter,如another question 中所述,尽管我认为这与这里无关。

有人能解释一下注册的HttpMessageConverter实际上做了什么,以及如何让@ResponseBody-annotated控制器方法返回UTF-8,而不必每次都提供produces吗?

编辑

正如 cmets 中所讨论的,为了使接受的答案正常工作,我必须将 Spring Boot 的版本从 0.5.0.M6 升级到 0.5.0.BUILD-SNAPSHOT,并且为了防止输出垃圾标题,请在 @987654337 上调用 converter.setWriteAcceptCharset(false) @。

【问题讨论】:

    标签: spring spring-mvc utf-8 spring-boot


    【解决方案1】:

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

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

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

    然后不再需要调用setSupportedMediaTypes(),因为text/plain; charset=default character set 会自动添加。

    【讨论】:

    • 我认为这是正确的,但它并不能完全回答问题,因为 OP 中的代码也应该可以工作。我认为 OP 正在寻找的答案是“将 Spring Boot 升级到 m7 或最近的快照”(他链接到的文档中的功能是新的)。
    • @DaveSyer "有人能解释一下注册的HttpMessageConverter实际上做了什么,以及如何让@ResponseBody-annotated控制器方法返回UTF-8,而不必每次都提供生产" - 答案完全涵盖了这一点,你不觉得吗?
    • 嗯,虽然它确实将charset=UTF-8 添加到Content-Type,但返回的文本实际上仍然是ISO-8859-1。
    • @HalleKnast 请求的AcceptAccept-Charset 标头具有哪些值?你怎么知道它的ISO-8859-1?你没有收到æøå吗?
    • 我使用 Chrome。网络检查面板提供请求标头Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8,没有Accept-Charset 标头。我知道,因为当我告诉 Chrome 将页面编码从 UTF-8 更改为 ISO-8859-1 时,页面从 ��� 更改为 æøå
    猜你喜欢
    • 2021-10-06
    • 1970-01-01
    • 2021-08-13
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    相关资源
    最近更新 更多