文档章节

springmvc 配置 messageConverters 和解决中文乱码 和 HttpMediaTypeNotAcceptableException

之渊
 之渊
发布于 2018/12/22 17:10
字数 966
阅读 81
收藏 1

开始接触使用springmvc的时候, 返回controller 内容中文乱码。

百度一下,然后配置 messageConverters 加上 

<bean class="org.springframework.http.converter.StringHttpMessageConverter">
					<constructor-arg value="UTF-8"/>
					<property name="supportedMediaTypes">
						<list>
						    <value>text/html;charset=UTF-8</value>  
						   
							<value>text/plain; charset=UTF-8</value>
						</list>
					</property>
				</bean>

即解决了中文乱码。

假设我们不加上 json 数据的消息处理

比如 

<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" >

那么 如果 controller 返回 对象或者json 对象肯定会报错:HttpMediaTypeNotAcceptableException: Could not find acceptable representation

因为 没有 对应消息处理器 处理该返回值,MediaType 类型返回的  contenType 类型肯定是 application/json

StringHttpMessageConverter 处理返回的 contenType 是 text 或者 plain 

 

org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
	at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:126)
	at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:90)
	at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:189)
	at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:69)
	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:122)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)

 

在 messageConverters 加上  <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" > 

即可解决了,也就是 controller 可以直接 返回对象 了。

就是这样解决了问题。其实不太明白这样配置的意思。

 

 

解惑

StringHttpMessageConverter

StringHttpMessageConverter 只能对 controller 的 返回 string 类型的内容进行 处理,

如果是其他的对象, 甚至是  controller 返回的 int 类型, spirngmvc 也不会使用 StringHttpMessageConverter 对返回的内容进行处理的。

会将 StringHttpMessageConverter 忽略掉,如果没有 消息处理器对这个返回结果进行处理,那么就会 抛出 :

HttpMediaTypeNotAcceptableException: Could not find acceptable representation 异常

那么为什么 不配置 StringHttpMessageConverter  会导致中文乱码?

因为 查看一下 StringHttpMessageConverter  源码可以知道, StringHttpMessageConverter  默认的编码

public static final Charset DEFAULT_CHARSET = Charset.forName("ISO-8859-1");

使用了这个,如果不配置指定  ISO-8859-1 肯定中文乱码了。

而 StringHttpMessageConverter 有一个 构造方法,允许指定 编码

因此 

<bean class="org.springframework.http.converter.StringHttpMessageConverter">
                    <constructor-arg value="UTF-8"/>

即可 解决中文乱码。

即supportedMediaTypes 配置不指定 编码也是不会中文乱码的

<bean class="org.springframework.http.converter.StringHttpMessageConverter">
					 <constructor-arg value="UTF-8"/>
					 <property name="supportedMediaTypes">
						<list>
							<value>text/plain</value>
							<value>text/html</value>  
							
						</list>
					</property> 
				</bean>

 

如果 这样配置访问 controller  返回string 类型的 方法

就可以通过 debug 日志看到 例如 :

 RequestResponseBodyMethodProcessor.writeWithMessageConverters(150) | Written [{"a":"aa哈哈"}] as "text/html" using [org.springframework.http.converter.StringHttpMessageConverter@20c2

而 这时候 

这时候的响应给客户端的响应头 Content-Type 肯定是 

Content-Type:text/html;charset=UTF-8

 

也就是说

supportedMediaTypes   配置的是 StringHttpMessageConverter 响应给客户端的 Content-Type 内容。

这个 StringHttpMessageConverter 源码里面,默认的 supportedMediaTypes 就是  text和 plain 

即             <value>text/html</value> 
                            <value>text/plain</value> 

其实 这个 supportedMediaTypes 我们可以配置很多种类型的

比如 配置 <value>application/json;charset=UTF-8</value>

springmvc 将 尽量 根据内容 尽量使用 对应的 ,正确的 Content-Type

比如 只配置了  <value>application/json;charset=UTF-8</value>

那么 Content-Type 就是 application/json;charset=UTF-8 

是不会 报错的。

 

 

第二 种解决中文乱码

StringHttpMessageConverter 配置 构造方法没有指定 字符集而是 supportedMediaTypes 指定字符集

<property name="supportedMediaTypes">
						<list>
							<value>text/plain; charset=UTF-8</value>
							<value>text/html; charset=UTF-8</value>  
						</list>
					</property>

 

那么 StringHttpMessageConverter 就会根据 supportedMediaTypes 里面的 charset 来使用 响应的字符集,

也就是 这样也是可以防止乱码的。 

 

 

第三 返回json 对象或者对象不乱码?

比如配置了

<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" > 
                </bean>     

也就是 说将使用其处理 所有的类型,

假如没有配置 StringHttpMessageConverter

那么 string类型的返回controller 方法 最终也是会使用 MappingJacksonHttpMessageConverter 进行处理的,

只是 contentype 将是 application/json;charset=UTF-8

如果配置 StringHttpMessageConverter 了,那么string类型的 返回方法将使用 StringHttpMessageConverter 来处理,

从 名字就可以看出来了。

 

MappingJacksonHttpMessageConverter 处理过的 响应头部都是 application/json;charset=UTF-8

因为 

MappingJacksonHttpMessageConverter 源码默认指定了 默认字符集 UTF-8所以我们配置的时候不需要指定 字符集了,不会乱码的

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

© 著作权归作者所有

之渊
粉丝 13
博文 643
码字总数 195996
作品 0
佛山
程序员
私信 提问
spring mvc json 返回乱码问题解决(vestion:3.x.x)

工程中用springmvc返回json格式时,中文乱码了,看了一下springmvc源码发现 StringHttpMessageConverter 这个类的默认编码为ISO-8859-1(悲剧,springmvc这么大的东西怎么不用utf-8,搞不懂)...

不正常的物种
2013/08/01
4.7K
0
【转】Ajax响应中文乱码 [SpringMVC使用@ResponseBody处理Ajax请求]

Spring3.0 MVC @ResponseBody 的作用是把返回值直接写到HTTP response body里。 Spring使用AnnotationMethodHandlerAdapter的handleResponseBody方法, AnnotationMethodHandlerAdapter使用r......

一堆BUG
2013/09/10
792
0
spring boot 解决后台返回 json 到前台中文乱码之后出现返回json数据报错 500

问题描述 spring Boot 中文返回给浏览器乱码 解析成问号?? fastJson jackJson spring boot 新增配置解决后台返回 json 到前台中文乱码之后,出现返回json数据报错:no convertter for retur...

陈守印
2018/06/15
246
0
SpringMVC使用@ResponseBody输出字符串时遇到的乱码问题及解决办法

今番又遇到乱码问题,有时候真觉得英语母语的那些地区确实挺省事的,至少不用为了这个经典麻烦去折腾。 网络上讨论乱码问题的文章很多,因为各作者使用的计算机环境的不同,往往不是很全面。...

wangwei2134
2018/11/02
24
0
解决spring-mvc @responseBody注解返回json 乱码问题

在使用spring-mvc的mvc的时候既享受它带来的便捷,又头痛它的一些问题,比如经典的中文乱码问题。现在是用json作为客户端和服务端 的数据交换格式貌似很流行,但是在springmvc中有时候会因为...

刘志成
2013/11/15
30.4K
9

没有更多内容

加载失败,请刷新页面

加载更多

如何查看ubuntu的版本

cat /etc/issue

南桥北木
19分钟前
1
0
超详细Linux下QT使用appimage打包程序

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/kuer1379/article/details/82885810 一 打包工具 1.linuxd...

shzwork
25分钟前
2
0
Checkstyle的style

checkstyle是什么? 是代码规范检查,关于各种格式的利弊这里就不说了,但是业内有一些总结的规范利于goole或者阿里有自己的代码规范,就需要用到checkstyle。我个人很讨厌这东西,奈何项目再...

stayStand
28分钟前
5
0
左边竖条的实现方法

下面这个图形,只使用一个标签,可以有多少种实现方式: 假设我们的单标签是一个 div : 1 < div > div> 定义如下通用CSS: 1 2 3 4 5 6 div{ position : relative ; width : 200px ; height ...

前端老手
47分钟前
3
0
java利用ECHARTS.JS在前台显示图表

步骤1: (1)在java后台,使用MSQL分组函数,列出所有线在对应的点的值, (2)组成的Map如图所示: 注意: key为0的value表示X轴需要的数据;key为其他的值表示图表线条的名字,value为x轴的点对应的y...

文文1
50分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部