在构建RESTful
服务时, 我们常常会把一个对象直接转换成json
对象, 就像下面这样:
@RestController
public class HomeController {
@RequestMapping("/")
Map<String, Object> home() {
Map<String, Object> map = Maps.newHashMap();
map.put("name", "中文");
map.put("age", 18);
return map;
}
}
Spring
提供了多种HttpMessageConverter
让我们对结果进行转换, 像上面那样, 把对象转换成json
格式输出, Spring boot
默认使用MappingJackson2HttpMessageConverter
进行转换. 如果我们想要使用另一个工具进行json
转换, 或者想添加自己的HttpMessageConverter
, Spring boot
提供了多种不通的方式来实现.
我们以GsonHttpMessageConverter
为例, 除了主配置类之外, 我们添加另一个配置类, 从这个类中添加自己的Converter
直接添加一个Bean
, 它将添加到Converter
列表的最前面
Converter
列表代码如下:
@Configuration
public class WebMvcConfig {
@Bean
public GsonHttpMessageConverter gsonHttpMessageConverter() {
Gson gson = new GsonBuilder().serializeNulls() // null 也序列化
.setDateFormat("yyyy-MM-dd HH:mm:ss") // 时间转化为特定格式 yyyy-MM-dd HH:mm:ss
.create();
GsonHttpMessageConverter converter = new GsonHttpMessageConverter();
converter.setGson(gson);
return converter;
}
}
继承WebMvcConfigurerAdapter
, 覆盖configureMessageConverters
方法
List
, 断点调试会发现, 这是向列表中添加的第一个Converter
Converter
, 就无法保证以固定的顺序添加到列表中了代码如下:
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
Gson gson = new GsonBuilder().serializeNulls() // null 也序列化
.setDateFormat("yyyy-MM-dd HH:mm:ss") // 时间转化为特定格式 yyyy-MM-dd HH:mm:ss
.create();
GsonHttpMessageConverter converter = new GsonHttpMessageConverter();
converter.setGson(gson);
converters.add(converter);
}
}
继承WebMvcConfigurerAdapter
, 覆盖extendMessageConverters
方法
Converter
加入列表之后执行, 可以进行精确控制, 如顺序等代码如下:
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.clear(); // 把其他 converter 清除掉
Gson gson = new GsonBuilder().serializeNulls() // null 也序列化
.setDateFormat("yyyy-MM-dd HH:mm:ss") // 时间转化为特定格式 yyyy-MM-dd HH:mm:ss
.create();
GsonHttpMessageConverter converter = new GsonHttpMessageConverter();
converter.setGson(gson);
converters.add(converter);
}
}