参考网上的一些测评,得知Gson对小文件处理比较快,Jackson处理大文件比较好,而系统主要处理小文件请求,因此打算使用Gson替换默认的Jackson。
注意项目使用Maven进行项目管理,依赖的版本号均在parent POM或import POM中维护,因此下面的Maven配置无版本号。
通常情况(排除jackson依赖)
在依赖中排除所有jackson相关依赖, 如:
1 2 3 4 5 6 7 8 9 10
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </exclusion> </exclusions> </dependency>
|
注意所有jackson-core,jackson-databind依赖均需要排除,可使用 mvn dependency:tree查看项目依赖。
依赖排除完成的同时加入gson依赖。
1 2 3 4
| <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> </dependency>
|
查看spring-webmvc.jar中WebMvcConfigurationSupport.java源码
1 2
| private static final boolean jackson2Present = ClassUtils.isPresent("com.fasterxml.jackson.databind.ObjectMapper", WebMvcConfigurationSupport.class.getClassLoader()) && ClassUtils.isPresent("com.fasterxml.jackson.core.JsonGenerator", WebMvcConfigurationSupport.class.getClassLoader()); private static final boolean gsonPresent = ClassUtils.isPresent("com.google.gson.Gson", WebMvcConfigurationSupport.class.getClassLoader());
|
1 2 3 4 5 6 7 8 9
| protected final void addDefaultHttpMessageConverters(List<HttpMessageConverter<?>> messageConverters) { ... if(jackson2Present) { objectMapper = Jackson2ObjectMapperBuilder.json().applicationContext(this.applicationContext).build(); messageConverters.add(new MappingJackson2HttpMessageConverter(objectMapper)); } else if(gsonPresent) { messageConverters.add(new GsonHttpMessageConverter()); } }
|
因此系统找不到jackson依赖时,Spring MVC便会使用GsonHttpMessageConverter而不是MappingJackson2HttpMessageConverter。
特殊情况(无法排除jackson依赖)
若无法排除jackson依赖(如其他依赖需要jackson),参考上面的源码得知Spring MVC在jackson和gson依赖都存在的情况下优先使用MappingJackson2HttpMessageConverter,因此需要代码中进行调整。
1 2 3 4 5 6 7 8 9 10
| @Configuration @EnableWebMvc public class WebConfiguration extends WebMvcConfigurerAdapter { @Override public void extendMessageConverters(List<HttpMessageConverter<?>> converters) { converters.removeIf(httpMessageConverter -> httpMessageConverter instanceof MappingJackson2HttpMessageConverter); // 删除MappingJackson2HttpMessageConverter converters.add(new GsonHttpMessageConverter()); // 添加GsonHttpMessageConverter } ... }
|
总结
以上便是我在Spring Boot中使用Gson替换Jackson的相关配置,同样的仅使用Spring MVC而未使用Spring Boot配置也类似。