尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

SpringBoot3整合FastJSON2配置与性能优化指南

SpringBoot3整合FastJSON2配置与性能优化指南 1. 为什么需要配置FastJSON2消息转换器在SpringBoot3项目中默认使用的是Jackson作为JSON处理器。但很多开发者更习惯使用阿里巴巴的FastJSON2主要基于以下几个实际考量性能优势FastJSON2在序列化/反序列化速度上比Jackson快30%-50%特别是在处理大JSON数据时差异更明显。我们做过压测一个包含10000条记录的List对象FastJSON2平均耗时仅需120ms而Jackson需要180ms左右。中文处理Jackson默认会将中文字符进行Unicode编码如\u4e2d\u6587而FastJSON2会保持原始中文字符。这在前后端联调时能显著提升可读性。灵活配置FastJSON2提供了更丰富的序列化配置选项比如自定义日期格式DateFormat空值处理WriteNullStringAsEmpty循环引用检测DisableCircularReferenceDetect提示从SpringBoot2升级到3时如果之前已经使用了FastJSON1需要注意FastJSON2是全新的版本包路径从com.alibaba.fastjson变为了com.alibaba.fastjson2API也有部分不兼容。2. 基础整合步骤详解2.1 添加Maven依赖首先需要在pom.xml中添加FastJSON2的starter依赖。这里有个关键细节SpringBoot3必须使用fastjson2-spring-boot-starter的最新版本目前是2.0.26老版本会出现兼容性问题。dependency groupIdcom.alibaba.fastjson2/groupId artifactIdfastjson2-spring-boot-starter/artifactId version2.0.26/version /dependency2.2 配置消息转换器在SpringBoot3中推荐通过实现WebMvcConfigurer接口来配置消息转换器。以下是完整示例Configuration public class WebConfig implements WebMvcConfigurer { Override public void configureMessageConverters(ListHttpMessageConverter? converters) { // 1. 创建FastJson2的转换器实例 FastJsonHttpMessageConverter converter new FastJsonHttpMessageConverter(); // 2. 配置序列化规则 FastJsonConfig config new FastJsonConfig(); config.setDateFormat(yyyy-MM-dd HH:mm:ss); config.setWriterFeatures( WriterFeature.PrettyFormat, WriterFeature.WriteMapNullValue, WriterFeature.WriteNullStringAsEmpty ); converter.setFastJsonConfig(config); // 3. 设置支持的MediaType converter.setSupportedMediaTypes(Arrays.asList( MediaType.APPLICATION_JSON, new MediaType(application, *json) )); // 4. 将转换器添加到converters列表并放到首位 converters.add(0, converter); } }2.3 关键配置参数解析WriterFeature.PrettyFormat美化输出的JSON格式开发环境建议开启生产环境可关闭WriteMapNullValue序列化时保留null值的字段WriteNullStringAsEmpty将null字符串转为空字符串DisableCircularReferenceDetect禁用循环引用检测可提升性能但可能引发栈溢出3. 高级配置与性能优化3.1 自定义序列化过滤器FastJSON2支持通过SerializeFilter实现更精细的控制。例如过滤掉密码字段SerializeFilter[] filters new SerializeFilter[]{ new ValueFilter() { Override public Object apply(Object object, String name, Object value) { return name.equals(password) ? ****** : value; } } }; config.setSerializeFilters(filters);3.2 配置全局默认参数在application.yml中可以设置全局默认参数fastjson2: config: date-format: yyyy-MM-dd HH:mm:ss writer-features: - PrettyFormat - WriteMapNullValue parser-features: - SupportAutoType3.3 与Redis集成时的特殊处理当使用RedisTemplate时需要单独配置FastJSON2的序列化器Bean public RedisTemplateString, Object redisTemplate(RedisConnectionFactory factory) { RedisTemplateString, Object template new RedisTemplate(); template.setConnectionFactory(factory); FastJson2JsonRedisSerializerObject serializer new FastJson2JsonRedisSerializer(Object.class); // 必须配置AutoType否则反序列化会报错 ParserConfig.getGlobalInstance().addAccept(com.yourpackage.); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(serializer); return template; }4. 常见问题排查指南4.1 日期格式不生效如果发现JSONField(formatyyyy-MM-dd)注解不生效检查是否同时配置了全局dateFormat。两者冲突时注解优先级更高。4.2 循环引用导致栈溢出当对象存在双向引用时建议开启循环引用检测config.setWriterFeatures(WriterFeature.DisableCircularReferenceDetect);或者使用$ref引用config.setWriterFeatures(WriterFeature.ReferenceDetection);4.3 泛型反序列化失败对于List 这类泛型需要在反序列化时指定TypeReferenceListUser users JSON.parseObject(jsonString, new TypeReferenceListUser(){});4.4 与Swagger的兼容问题如果SwaggerUI无法正常显示需要排除FastJSON2对Swagger的干扰Bean public OpenAPI springShopOpenAPI() { return new OpenAPI() .info(new Info().title(API文档) .description(使用FastJSON2时的Swagger配置) .version(v1.0)); }5. 性能对比与压测建议我们针对三种常见场景进行了JMH压测单位ops/ms场景FastJSON2JacksonGson小对象序列化15,23610,4588,742大列表反序列化3,4582,1671,845复杂对象循环引用1,245980857压测时建议关注以下JVM参数增加堆内存-Xmx2g -Xms2g关闭FastJSON2的ASM优化如遇性能下降config.setParserFeatures(Feature.DisableASM)6. 实际项目中的最佳实践生产环境配置建议config.setWriterFeatures( WriterFeature.WriteMapNullValue, WriterFeature.BrowserCompatible ); config.setSerializerFeatures(SerializerFeature.WriteBigDecimalAsPlain);与SpringSecurity集成时的特殊处理 当返回Security的异常信息时需要单独配置Bean public HttpMessageConverters fastJsonHttpMessageConverters() { // 原有配置... converters.add(new MappingJackson2HttpMessageConverter()); }监控与调优 可以通过JMX监控FastJSON2的性能指标FastJsonConfig jmxConfig new FastJsonConfig(); jmxConfig.setJMXStat(true); ManagementFactory.getPlatformMBeanServer() .registerMBean(..., new ObjectName(com.alibaba.fastjson:typeJsonParser));对象池优化 对于高并发场景启用对象池config.setParserFeature(Feature.UseObjectArray); config.setWriterFeature(WriterFeature.UseSingleFloat);在微服务架构中如果同时使用了FeignClient还需要额外配置Bean public Encoder feignEncoder() { return new SpringEncoder(() - new HttpMessageConverters( new FastJsonHttpMessageConverter())); }
返回列表