关于SpringBoot启用FastJson解析框架,字符串Null需转为空串思路

一、问题描述

近期项目开发过程中,项目使用的是前后端分离架构,前端使用ANT DESIGN VUE,后端采用SpringBoot+Mybatis,数据库使用PG。如果前端定义的VUE变量为空串,后端用实体接收后,保存到数据库中该变量的字段会为空串,而不是NULL,从而出现后端服务在发起数据库查询时,用IS NULL条件无法过滤出来字段为空的数据记录问题。

二、解决思路

针对上述提到的问题,有两种方案:

1、修改前端上送的所有页面代码,初始化变量时,将空串‘’全部替换成NULL

–修改的地方比较多,并且不能确保服务接口类的请求有出现空串,不建议使用

2、修改后端代码,在应用请求接收变量映射(将JSON字符串转成JAVA实体)处,统一将空串‘’替换成NULL

–修改地方比较少,可做到统一控制,兼容前端界面和接口请求,建议使用该方案

现行项目使用的SpringBoot框架,针对JSON的解析,将Jakson解析统一替换成FastJson,(解决jackson 解析的字段中有单个字母作为驼峰单词的, 单个字母后面的大写字母会默认取小写的, 而不是原样取值的问题如”wWorkDays”字段,使用jackson解析成JSON字符串时,会变成wworkDays,以致原样字段无法正确取值和传送),因此要实现对字符串变量做个性化处理,因此考虑在Fastjson的的反序列化逻辑中添加此处理逻辑,方案如下:

fastJsonConfig.getParserConfig().putDeserializer(String.class, new ObjectDeserializer() {@Overridepublic T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {if (String.class.equals(type)) {String fieldValue = (String) parser.parse(fieldName);if (StrUtil.isBlank(fieldValue)) {fieldValue = null;}return (T) fieldValue;}return (T) parser.parse(fieldName);}

最终代码如下:

/** * 将SpringBoot的Jakson解析统一替换成FastJson * 以解决jackson 解析的字段中有单个字母作为驼峰单词的, 单个字母后面的大写字母会默认取小写的, 而不是原样取值的问题 * 如”wWorkDays”字段,使用jackson解析成JSON字符串时,会变成wworkDays,以致原样字段无法正确取值和传送 * 使用FastJson可解决该问题 * * @return */@Beanpublic HttpMessageConverters fastJsonHttpMessageConverters() {FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();fastJsonHttpMessageConverter.setSupportedMediaTypes(getSupportedMediaTypes());fastJsonHttpMessageConverter.setDefaultCharset(StandardCharsets.UTF_8);FastJsonConfig fastJsonConfig = new FastJsonConfig();fastJsonConfig.setDateFormat(“yyyy-MM-dd’T’HH:mm:ss.SSSXXX”);//全局转化成带时区的时间,例如,2021-09-28T09:28:05.000+08:00fastJsonConfig.setSerializerFeatures(SerializerFeature.DisableCircularReferenceDetect, //禁用循环引用SerializerFeature.IgnoreNonFieldGetter,//忽略NULL字段SerializerFeature.WriteDateUseDateFormat//使用统一的时间格式);// 对String变量反序列化进行定制处理,如果字符串为空串,则转为NULL// 注:由于前端定义的字符为空串,发送到后台保存到数据库会保存为空串,在PG数据库和MYSQL数据库查询时用,isNULL无法过滤出来记录fastJsonConfig.getParserConfig().putDeserializer(String.class, new ObjectDeserializer() {@Overridepublic T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {if (String.class.equals(type)) {String fieldValue = (String) parser.parse(fieldName);if (StrUtil.isBlank(fieldValue)) {fieldValue = null;}return (T) fieldValue;}return (T) parser.parse(fieldName);}@Overridepublic int getFastMatchToken() {return 0;}});fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig);return new HttpMessageConverters(new StringHttpMessageConverter(StandardCharsets.UTF_8), fastJsonHttpMessageConverter);}/** * 支持的文档类型 * * @return */private List getSupportedMediaTypes() {List supportedMediaTypes = new ArrayList();supportedMediaTypes.add(MediaType.APPLICATION_JSON_UTF8);supportedMediaTypes.add(MediaType.APPLICATION_JSON);return supportedMediaTypes;}

三、问题总结

我们开发人员在碰到问题时头脑应该保持冷静,从了解原理出发,只要解决思路对,总会找到正确的解决之道。

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
(0)
用户投稿
上一篇 2022年6月15日
下一篇 2022年6月15日

相关推荐

  • 字节跳动4面,成功唬住面试官拿35K,突然感觉Python面试不是太难

    618福利来了 字节跳动的面试时间早上 8 点左右面试官来一个电话,问是否能面试。全程 6 面,前五面技术面,电话面试,最后一面是 HR 面,现场面。 第二部分:开源框架 第三部分…

    2022年6月12日
  • Python 数据结构之元组

    大家好啊,我是大田。 1、元组的定义下面 5 种形式都为定义元组的方式t = tuple(‘python’)t1 = (‘p’, &…

    2022年7月2日
  • 对话框管理器第三章:创建控件

    和上一篇创建框架窗口相比,创建控件的工作要轻松很多,信不信由你。在对话框模板中定义的每一个控件,其对应的子窗口将会被创建。控件的大小和位置在模板中是以DLU为单位来描述的,所以,理…

    2022年7月28日
  • Apache POI 遍历Excel:工作薄 > 工作表 > 数据行 > 单元格

    import org.apache.poi.ss.usermodel.*;import org.junit.jupiter.api.Test;import java.io.File…

    2022年6月16日
  • MySQL 事务的默认隔离级别是什么?可以解决幻读问题么?

    何谓事务? 我们设想一个场景,这个场景中我们需要插入多条相关联的数据到数据库,不幸的是,这个过程可能会遇到下面这些问题: 数据库中途突然因为某些原因挂掉了。 客户端突然因为网络原因…

    2022年6月15日
  • 一个天才少年-小澜

    刘伟直播间里那个横空出世的小学生——小澜,初次认识的时候是在某音看到他跟刘伟solo,一手露娜荣当刘伟师傅。小澜,15岁,打了80多把全国巅峰第三,评分85分,胜利65+。昨晚看了…

    2022年7月9日
  • 金砖国家数字经济伙伴关系框架开启金砖国家数字经济合作新进程

    新华社北京6月27日电(记者谢希瑶)商务部国际司副司长陈超27日表示,金砖国家领导人第十四次会晤达成的《金砖国家数字经济伙伴关系框架》,就深化金砖国家数字经济合作形成重要共识,开启…

    2022年9月6日
  • 人生意义是什么需要我们怎么正确的过好余下生命?

    不同的人赋予人生不同的意义,不同的阶段赋予人生的意义也不同,人生的意义没尽寸标准也没有定义,他是处在不同阶段在不同竟遇下主观世界里的微观变化。 我不爱谈论人生的意义,也不爱站在道德…

    2022年4月19日
  • 细说redis数据类型

    本文主要讲解redis的6种数据类型。 string redis的string可以存储3种数据类型:string,整数和浮点数。 常见的操作如下 命令名称 示例 描述 set se…

    2022年8月11日
  • 每日一练进击大厂「DAY7」并发编程4

    文章目录 一、有三个线程T1,T2,T3如何保证顺序执行 二、AQS 三、CountDownLatch 四、CyclicBarrier 五、Semaphore 六、自旋锁 七、偏向…

    2022年7月9日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息