Spring Boot配置FastJson消息转换器
导入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.72</version>
</dependency>
添加FastJson到消息转换器中
@Configuration
public class MessageConvertersConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
// 1. 定义消息转换器对象
FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
// 2. 添加FastJson配置,如格式化返回json数据
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
// 3. 在FastJson消息转换器中添加配置信息
fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);
fastJsonHttpMessageConverter.setDefaultCharset(StandardCharsets.UTF_8); //否则乱码
// 4. 向转换器中添加FastJson转换器
converters.add(fastJsonHttpMessageConverter);
}
}
取消Sprong Boot的Spring MVC starter中的Jackson依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.3.7.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
</exclusion>
</exclusions>
</dependency>
为什么要取消Jackson依赖
注意:这里不只是说取消Spring Mvc starter场景器中的Jackson依赖就可以。需要确保你的依赖中没有com.fasterxml.jackson.databind.ObjectMapper&&com.fasterxml.jackson.core.JsonGenerator
Spring Boot 默认配置 Jackson 时机:
org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport#addDefaultHttpMessageConverters(List<HttpMessageConverter<?>> messageConverters)
所以有时候虽然我们配置了自己的消息转换器,但却不起效果!!是因为执行了,看看源码
org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor#writeWithMessageConverters(T, MethodParameter, ServletServerHttpRequest, ServletServerHttpResponse)
当DispatcherServlet执行到org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor#handleReturnValue
的消息转换器时,就会去调用这个方法。所以启动项目时就添加的MappingJackson2HttpMessageConverter消息转换器在列表中的我们自定义的前面,所以执行完它时,就会return;
了,不会再指定到我们的FastJsonHttpMessageConverter。所以就导致自定义的FastJson消息转换器无效!