今天配置项目国际化后进行测试过程中发现了个奇怪的问题,测试返回中文字符串时显示为乱码,检查了国际化的encoding配置项,和文件的编码都没有问题,后来观察接口返回的Content-Type居然是text/plain;charset=ISO-8859-1
。
messages:
encoding: UTF-8
明明已经使用了@RestController
注解,相当于配置了@ResponseBody
,为什么返回的不是json格式呢?
原来是自己对@ResponseBody
注解,理解的有问题,之前使用@ResponseBody
多是用来进行对象到json格式的转换,就把这个注解和json给绑定到一起了。
实际上:
@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据。
实际上spring会根据返回值的类型对Content-Type进行设置
Spring能识别json,xml转换我们需要的格式数据,是通过一个非常重要接口
HttpMessageConverter
进行我们需要的格式转换,而StringHttpMessageConverter和 MappingJacksonHttpMessageConverter 则是HttpMessageConverter 实现类。
StringHttpMessageConverter的作用:负责读取字符串格式的数据和写出二进制格式的数据(当返回值时或者接受值是String类型时,是由这个处理)
MappingJacksonHttpMessageConverter: 负责读取和写入json格式的数据;(当返回值是对象或者List,就由这个处理)
ByteArrayHttpMessageConverter: 负责读取二进制格式的数据和写出二进制格式的数据;
FormHttpMessageConverter:负责读取form提交的数据(能读取的数据格式为 application/x-www-form-urlencoded,不能读取multipart/form-data格式数据);负责写入application/x-www-from-urlencoded和multipart/form-data格式的数据;ResourceHttpMessageConverter:负责读取资源文件和写出资源文件数据;
SourceHttpMessageConverter: 负责读取和写入 xml 中javax.xml.transform.Source定义的数据;
Jaxb2RootElementHttpMessageConverter: 负责读取和写入xml 标签格式的数据;
AtomFeedHttpMessageConverter: 负责读取和写入Atom格式的数据;
RssChannelHttpMessageConverter: 负责读取和写入RSS格式的数据;
因为我的测试接口返回值是String类型,所以并没有转成json,编码格式也还是ISO-8859-1
。
搞清楚原因后使用produces强制进行修改:
@RequestMapping(value = "/testMsg",produces = "application/json; charset=utf-8")
问题解决。
(使用spring自带国际化时,必须创建默认文件messages.properties
,不然所有的properties都不会进行加载)