一、添加依赖
新建一个最简单的Spring项目,导入Web依赖,可以发现依赖里面包含了json依赖,此依赖默认使用的是jackson,如果使用Gson需要在pom.xml中去掉Jackson依赖,并加入Gson依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!-- 除去jackson依赖-->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 加入Gson依赖-->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
二、查看源码
GsonHttpMessageConvertersConfiguration.java
org/springframework/boot/autoconfigure/http/GsonHttpMessageConvertersConfiguration.java
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(Gson.class)
class GsonHttpMessageConvertersConfiguration {
@Configuration(proxyBeanMethods = false)
@ConditionalOnBean(Gson.class)
@Conditional(PreferGsonOrJacksonAndJsonbUnavailableCondition.class)
static class GsonHttpMessageConverterConfiguration {
@Bean
@ConditionalOnMissingBean
GsonHttpMessageConverter gsonHttpMessageConverter(Gson gson) {
GsonHttpMessageConverter converter = new GsonHttpMessageConverter();
converter.setGson(gson);
return converter;
}
}
@ConditionalOnClass(ObjectMapper.class)
:如果用户导入Gson依赖,系统才会默认使用以上配置,使用MappingJackson2HttpMessageConverter
转换工具类,才会生效。
@ConditionalOnMissingBean
:如果没有配置Bean,系统会默认使用这里的Bean,如果用户对时间格式等另外有需求,需要自主配置,系统则会优先使用用户配置的Bean而忽略系统配置的Bean
GsonAutoConfiguration.java
org/springframework/boot/autoconfigure/gson/GsonAutoConfiguration.java
@Bean
@ConditionalOnMissingBean
public Gson gson(GsonBuilder gsonBuilder) {
return gsonBuilder.create();
}
三、自定义配置
系统默认配置调试
写一个简单的Controller类,进行简单的测试
@RestController
@RequestMapping("/test")
public class StudentController {
@GetMapping("/hello")
public Student get(){
Student student = new Student();
student.setId((long) 1);
student.setAge(15);
student.setName("alvin");
student.setBirthday(new Date());
return student;
}
}
- Debug调试:
@ConditionalOnClass(Gson.class)中的Gson.class是从GsonAutoConfiguration.java中注入进来的,因此小程序先执行GsonAutoConfiguration.java,然后执行GsonHttpMessageConvertersConfiguration.java. - postman调用
Gson日期的默认返回格式为"Feb 22, 2020 1:55:24 PM",如果用户对日期格式或者其他属性的格式另有需求,可以自定义配置。
自定义配置方法与调试:
方案一:
新建一个JsonConfig.java
作为配置类
@Configuration
public class JsonConfig {
@Bean
public GsonHttpMessageConverter gsonHttpMessageConverter(){
GsonHttpMessageConverter converter = new GsonHttpMessageConverter();
converter.setGson(new GsonBuilder().setDateFormat("yyyy-MM-dd").create());
return converter;
}
}
- Debug调试
- postman返回
方案二:
通过方案一,debug发现,系统仅仅是对注入进来的Gson进行了操作,因此可以直接创建一个Gson对象,在GsonAutoConfiguration.java中有一个注解是@ConditionalOnMissingBean
,如果用户创建一个新的Gson,GsonAutoConfiguration.java中的Bean将会失效。
@Bean
Gson gson(){
return new GsonBuilder().setDateFormat("yyyy/MM/dd").create();
}
- Debug
通过可以看到,用户自主创建的Bean主动注入进了GsonHttpMessageConvertersConfiguration.java里面,而GsonAutoConfiguration.java中的Bean失效了。 - postman返回