深入理解Spring MVC Controller返回String类型导致中文乱码的问题。
Posted starjuly
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入理解Spring MVC Controller返回String类型导致中文乱码的问题。相关的知识,希望对你有一定的参考价值。
代码
- 在Controller层写下如下的测试代码:
@GetMapping
public String test()
return "这是一个中文句子";
调试
- 在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)
- 因为返回的是String类型,所以会进入到if (value instanceof CharSequence)的判断中,如下图所示:
- 然后进入getProducibleMediaTypes方法,获取到producibleMediaTypes,这里能获取到4个mediaType。
- 做判断,因为contentType为null,会进入getProducibleMediaTypes方法;
- 根据传进来的值,会进入到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:
- 接着对10个mediaType遍历判断
- 判断第一个text/html,符合条件,退出循环。
- 最后以text/html的格式输出,导致中文乱码:
converter.write(outputValue, selectedMediaType, outputMessage);
以上是关于深入理解Spring MVC Controller返回String类型导致中文乱码的问题。的主要内容,如果未能解决你的问题,请参考以下文章
关于Spring事务<tx:annotation-driven/>的理解(Controller可以使用@Transactional)