咸鱼开发修炼之路

从零开始搭建REST风格的Spring项目(二)

继续搭建REST 风格的Spring项目。
uscl87a.jpg

  上一节初步搭建了Spring项目,已经能成功访问Controller层的接口,但是,测试时会发现,如果字符串中有中文,返回值会出现乱码。
乱码.png
  这是因为SpringMVC字符串转换器StringHttpMessageConverter默认的编码格式是ISO-8859-1,而我们通过url传递的参数编码格式为utf-8格式,所以需要更改字符串转换器的编码设置。
字符串格式.png
  配置也很简单,只需在WebConfig类中重写configureMessageConverters方法,创建新的字符串转换器,添加到List>容器中即可。

1
2
3
4
5
6
7
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
super.configureMessageConverters(converters);
// 配置字符创支持中文
StringHttpMessageConverter converter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
converters.add(converter);
}
 
再次测试接口,发现已经能正常显示中文字符了。

在REST API中,资源表述的首选应该是JSON和XML,目前来说,使用JSON更多一些,因为JSON在JavaScript中解析更加方便。Spring中提供了两种方法将资源的Java表述转换为消息发送到客户端:

  • 内容协商(Content negotitation):选择一个视图,能将模型渲染为呈现给客户端的表述形式。
  • 消息转换器(Message conversion):通过一个消息转换器将控制器所返回的对象转换为呈现给客户端的表述形式。

  内容协商通过ContentNegotitatingViewResolver对视图进行转换,通过contentNagotitionManager改变默认行为。ContentNegotitatingViewResolver的最大优势在于它在SpringMVC之上构建REST资源表述层,控制器代码无需修改。相同一套控制器方法可以根据请求不同产生JSON或XML,也能产生HTML。
如果面向人类的视图与需要返回JSON格式数据的接口没有太多重叠(例如REST API),就体现不出什么优势了。
  而且,作为ViewResolver的实现,它只能决定如何渲染资源到客户端,没有涉及客户端发送什么样的数据给Controller,如果客户端使用JSON格式发送数据,那这个Resolver就无法提供什么帮助了。
  所以还是推荐使用HTTP消息转换器的方式,它能将控制器产生的数据转换为服务客户端的表述形式,当使用消息转换器时,DispatchServlet不需要将模型传送到视图,事实上已经没有模型的概念了,只有控制器产生的数据,以及消息转换器转换后产生的资源表述(一般为JSON格式字符串)。通过获取客户端请求头Accept头信息,用不同的转换器处理数据。
Spring提供了多个HTTP消息转换器,用于实现各种资源表述与Java对象之间的转换。
Spring转换器.png

在本项目中,我们使用MappingJackson2HttpMessageConverter作为Json转换器。使用这个转换器需要导入对应的包,所以需要去maven配置中加上下面内容(根据Spring版本不同,版本号会有区别):

1
2
3
4
5
6
7
8
9
10
11
12
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.8</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.8</version>
</dependency>

在WebConfig中添加转换器:

1
2
3
4
5
6
7
8
9
10
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
super.configureMessageConverters(converters);
// 配置字符创支持中文
StringHttpMessageConverter converter = new StringHttpMessageConverter(Charset.forName("UTF-8"));
// 使用Jackson2Json JSON库 配置Json转换器
MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
converters.add(jsonConverter);
converters.add(converter);
}

编写代码测试:
微信截图_20170617144738.png
可见框架已经支持JSON对象转换。