深入理解Spring MVC Controller返回String类型导致中文乱码的问题。

代码

  • 在Controller层写下如下的测试代码:
 	@GetMapping
    public String test() {
        return "这是一个中文句子";
    }

调试

  1. 在return返回后,使用调试模式,知道代码会进入到AbstractMessageConverterMethodProcessor类的writeWithMessageConverters方法:
org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor#writeWithMessageConverters(T, org.springframework.core.MethodParameter, org.springframework.http.server.ServletServerHttpRequest, org.springframework.http.server.ServletServerHttpResponse)
  1. 因为返回的是String类型,所以会进入到if (value instanceof CharSequence)的判断中,如下图所示:
    在这里插入图片描述
  2. 然后进入getProducibleMediaTypes方法,获取到producibleMediaTypes,这里能获取到4个mediaType。
  3. 做判断,因为contentType为null,会进入getProducibleMediaTypes方法;
    在这里插入图片描述
  4. 根据传进来的值,会进入到else if (converter.canWrite(valueClass, (MediaType)null))的判断,最后返回4个值:
0 = {MediaType@12594} "text/plain"
1 = {MediaType@12595} "*/*"
2 = {MediaType@10620} "application/json"
3 = {MediaType@10621} "application/*+json"

在这里插入图片描述
6. 遍历 producibleMediaTypes

  • 进入判断,进入getMostSpecificMediaType方法:
      mediaType = (MediaType)var15.next();
                   if (selectedMediaType.isCompatibleWith(mediaType)) {
                       compatibleMediaTypes.add(this.getMostSpecificMediaType(selectedMediaType, mediaType));
                   }
  • 获取到10个compatibleMediaTypes:
    在这里插入图片描述
  1. 接着对10个mediaType遍历判断
  • 判断第一个text/html,符合条件,退出循环。
    在这里插入图片描述
  1. 最后以text/html的格式输出,导致中文乱码:
 converter.write(outputValue, selectedMediaType, outputMessage);

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值