您的位置:首页 > 编程语言 > Java开发

SpringBoot中Json解析方案与自定义配置方法(二)——使用Gson

2020-03-17 18:40 941 查看

一、添加依赖

 新建一个最简单的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返回
  • 点赞
  • 收藏
  • 分享
  • 文章举报
Lukey Alvin 发布了84 篇原创文章 · 获赞 139 · 访问量 13万+ 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: