如今炒的火热的前后端分离项目,大多数开发人员选择RESTful设计风格,Java Web 人员经常要设计 RESTful API,这种设计通常使用 json 数据进行交互。那么前端传入的 json 数据如何序列化成 Java 对象,后端返回的结果又如何将 Java 对象解析成 json 格式数据返回给前端,在整个解析过程,HttpMessageConverter
起到了重要作用,各大公司实现了自己的HttpMessageConverter ,如:
MappingJackson2HttpMessageConverter
;GsonHttpMessageConverter
;FastJsonHttpMessageConverter
等等。spring-boot-stater-web依赖的json解析是jackson,同时也为我们进行了jackson的一系列自动化配置,这样我们不需要导入其他json依赖,就可以直接使用,其中起到关键作用的是MappingJackson2HttpMessageConverter;
@Bean
//如果我们自己提供MappingJackson2HttpMessageConverter则不使用Springboot提供的
@ConditionalOnMissingBean(value = MappingJackson2HttpMessageConverter.class,
ignoredType = {
"org.springframework.hateoas.server.mvc.TypeConstrainedMappingJackson2HttpMessageConverter",
"org.springframework.data.rest.webmvc.alps.AlpsJsonHttpMessageConverter" })
MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(ObjectMapper objectMapper) {
return new MappingJackson2HttpMessageConverter(objectMapper);
}
@ConditionalOnMissingBean(value = MappingJackson2HttpMessageConverter.class,…)注解也告诉我们,如果没有找到自定义的MappingJackson2HttpMessageConverter,将使用下面springboot提供的。
如果我们要自定义jackson只需重新定义MappingJackson2HttpMessageConverter,那么springboot提供的将不会生效,自定义方式如下:
@Configuration
public class WebMvcConfig {
@Bean
MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(){
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
ObjectMapper objectMapper = new ObjectMapper();
//自定义json日期格式
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd"));
//其他自定义配置
converter.setObjectMapper(objectMapper);
return converter;
}
}
由于spring-boot-stater-web已引入jackson,如果要使用gson需将jackson包排除掉,然后引入gson依赖即可,在pom.xml中添加如下配置:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-jsonartifactId>
exclusion>
exclusions>
dependency>
<dependency>
<groupId>com.google.code.gsongroupId>
<artifactId>gsonartifactId>
dependency>
此时我们发现gson依赖并不需要填写版本号,那是因为,springboot也为gson做了一套默认配置,同时管理gson版本,具体可查看spring-boot-dependencies下的pom依赖;
同样我们如果要自定义gson配置,只需重新定义GsonHttpMessageConverter即可:
@Bean
GsonHttpMessageConverter gsonHttpMessageConverter(){
GsonHttpMessageConverter converter = new GsonHttpMessageConverter();
GsonBuilder gsonBuilder = new GsonBuilder();
//使用GsonBuilder配置日期格式
gsonBuilder.setDateFormat("yyyy-MM-dd");
//其他配置
converter.setGson(gsonBuilder.create());
return converter;
}
同样将jackson包排除掉,然后引入fastjson依赖
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-jsonartifactId>
exclusion>
exclusions>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>fastjsonartifactId>
<version>1.2.58version>
dependency>
fastjson与jackson和gson略有不同,springboot没有提供fastjson的自动化配置,所以,就需要我们手动提供fastjson配置,如下:
@Bean
FastJsonHttpMessageConverter fastJsonHttpMessageConverter(){
FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
FastJsonConfig config = new FastJsonConfig();
//配置日期格式
config.setDateFormat("yyyy-MM-dd");
//其他配置
converter.setFastJsonConfig(config);
return converter;
}