SpringBoot2使用Gson替代jackson并适配Swagger
文章目录
涉及到的软件版本
- SpringBoot:2.2.5.RELEASE
- gson:2.8.6
- springfox-swagger2:2.9.2
为什么使用Gson
Gson与fastJson、jackson相比,对泛型
的支持比fastJson、jackson都要好。对于并不特别复杂的小型简单数据结构
的转换处理,性能上有明显优势。所以弃用SpringBoot2中内置的jackson,用Gson替代。
如何使用Gson
在spring-boot-starter-web
中已经引了Gson的依赖,所以pom.xml中无需改动。
思路
1、创建一个GsonHttpMessageConverter
,通过setDateFormat("yyyy-MM-dd")
指定日期格式,通过registerTypeAdapter(Json.class, new GsonConfig())
指定特殊类型的转换规则(用于解决springfox
不支持Gson的问题)。
2、再将GsonHttpMessageConverter
放入HttpMessageConverters
中。
3、在SpringApplication
启动类中禁止JacksonAutoConfiguration
。
完整代码示例
Gson配置类
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Collection;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.GsonHttpMessageConverter;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import springfox.documentation.spring.web.json.Json;
/**
* SpringfoxJsonToGsonAdapter
*/
@Configuration
public class GsonConfig implements JsonSerializer<Json> {
@Bean
public HttpMessageConverters customConverters() {
Collection<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
GsonHttpMessageConverter gsonHttpMessageConverter = new GsonHttpMessageConverter();
gsonHttpMessageConverter.setGson(
new GsonBuilder()
.setDateFormat("yyyy-MM-dd")
.registerTypeAdapter(Json.class, new GsonConfig())
.create());
messageConverters.add(gsonHttpMessageConverter);
return new HttpMessageConverters(true, messageConverters);
}
@SuppressWarnings("deprecation")
@Override
public JsonElement serialize(Json json, Type type, JsonSerializationContext context) {
final JsonParser parser = new JsonParser();
return parser.parse(json.value());
}
}
SpringApplication启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration;
/**
* SpringApplication
*/
...
@SpringBootApplication(exclude = { JacksonAutoConfiguration.class })
public class MyBootApplication {
public static void main(String[] args) {
SpringApplication.run(MyBootApplication.class, args);
}
}