1 自定义FastJsonHttpMessageConverter替换springboot 自带的MappingJackson2HttpMessageConverter
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;
@Configuration
public class WebContextConfiguration implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
/*添加fastjson*/
converters.add(0,fastJsonHttpMessageConverters(converters));
}
/**
* 定义fastjson替代jackson,
*
* @return
*/
private HttpMessageConverter fastJsonHttpMessageConverters(List<HttpMessageConverter<?>> converters) {
FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
for (int i = converters.size() - 1; i >= 0; i--) {
if (converters.get(i) instanceof MappingJackson2HttpMessageConverter) {
converters.remove(i);
}
if (converters.get(i) instanceof FastJsonHttpMessageConverter) {
converters.remove(i);
}
}
/*自定义fastjson配置*/
FastJsonConfig config = new FastJsonConfig();
config.setCharset(Charset.forName("UTF-8"));
config.setSerializerFeatures(
SerializerFeature.WriteMapNullValue,
SerializerFeature.QuoteFieldNames,
SerializerFeature.WriteDateUseDateFormat
);
fastJsonHttpMessageConverter.setFastJsonConfig(config);
List<MediaType> fastMediaTypes = new ArrayList<>();
fastMediaTypes.add(MediaType.TEXT_HTML);
fastMediaTypes.add(MediaType.APPLICATION_JSON);
fastMediaTypes.add(MediaType.APPLICATION_XML);
fastMediaTypes.add(MediaType.APPLICATION_FORM_URLENCODED);
fastMediaTypes.add(MediaType.APPLICATION_OCTET_STREAM);
fastJsonHttpMessageConverter.setSupportedMediaTypes(fastMediaTypes);
return fastJsonHttpMessageConverter;
}
}
2:如果是新建的springboot 项目,通过第一步的配置,自定义消息转换器已经生效了, 但是如果原先是springmvc 项目升级到springboot的且在xml 文件中有配置mvc:annotation-driven则可能没有生效(通过断点观察到配置成功了但是没起作用)。 原因在于mvc:annotation-driven 中先加载了RequestMappingHandlerAdapter, 但是这时刚配置的消息转换器还没有加载。通过跟踪源码会发现RequestMappingHandlerAdapter先后加载了两次,第二次才加载我们配置的那个转换器, 第一次走的是默认的转换器。通过跟踪 returnValueHandlers、RequestResponseBodyMethodProcessor 可以发现第一次加载时 getMessageConverters() 取到的是springboot默认的那几个转换器。
3:由springmvc 项目升级到springboot的且在xml 文件中有配置mvc:annotation-driven, 只需要删除所有mvc:annotation-driven 的配置, 自定义的转换器即可生效。
// 需要删掉它 不然自定义的消息转换器不起作用
<mvc:annotation-driven />