第一步:移除jackson依賴
參考代碼
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <!-- 排除jackson依賴 --> <exclusions> <exclusion> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </exclusion> </exclusions> </dependency>
第二步:加入gson依賴
參考代碼
<!-- 添加Gson依賴 --> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> </dependency>
完成
ps:進入WebMvcConfigurationSupport.java可以看到源碼
可以看到有這兩個常量
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());
一個是我們加入的gson,另一個則是jackson了。
其中還有這樣一個方法,用來返回messageConverters
protected final List<HttpMessageConverter<?>> getMessageConverters() { if (this.messageConverters == null) { this.messageConverters = new ArrayList<>(); configureMessageConverters(this.messageConverters); if (this.messageConverters.isEmpty()) { addDefaultHttpMessageConverters(this.messageConverters); } extendMessageConverters(this.messageConverters); } return this.messageConverters; }
通過查看addDefaultHttpMessageConverters這個方法,可以看到它是先判斷jackson2Present是否存在
存在則往messageConverters中加入MappingJackson2HttpMessageConverter
即如果gson和jackson同時存在則先判斷jackson加入MappingJackson2HttpMessageConverter
if (jackson2Present) { Jackson2ObjectMapperBuilder builder = Jackson2ObjectMapperBuilder.json(); if (this.applicationContext != null) { builder.applicationContext(this.applicationContext); } messageConverters.add(new MappingJackson2HttpMessageConverter(builder.build())); } else if (gsonPresent) { messageConverters.add(new GsonHttpMessageConverter()); }
因此,如果出現無法排除jackson等特殊情況,可以通過重寫extendMessageConverters方法來使getMessageConverters方法返回一個修改過的messageConverters(就是下面這個集合)
private List<HttpMessageConverter<?>> messageConverters;
繼承WebMvcConfigurationSupport,重寫extendMessageConverters方法,再刪除其中的MappingJackson2HttpMessageConverter,加入GsonHttpMessageConverter
參考代碼
@Configuration @EnableWebMvc public class GsonUtils extends WebMvcConfigurationSupport { @Override protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) { converters.removeIf(httpMessageConverter -> httpMessageConverter instanceof MappingJackson2HttpMessageConverter); converters.add(new GsonHttpMessageConverter()); super.extendMessageConverters(converters); } }
還可以參考這種方法:https://www.jianshu.com/p/0b1f376bce5b
————————————————
版權聲明:本文為CSDN博主「fwens」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_39885435/article/details/82624067