关于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)删除。
用户投稿
上一篇 2022年6月15日 06:11
下一篇 2022年6月15日 06:11

相关推荐

  • 短视频策划内容的3个要点(短视频策划内容怎么做)

    短视频在制作时,内容框架非常重要。如果直奔主题,然后结束,聚卓告诉你,这样的短视频已经过时了。现在的短视频需要框架的,但不是任何框架,它需要一种易于理解和消化的框架。而且,现在大多…

    2022年11月27日
  • 存储过程语法(sql server存储过程语法)

    今天小编给各位分享存储过程语法的知识,其中也会对sql server存储过程语法进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧! oracle存储过程基本语法…

    2022年11月26日
  • 马斯克凌晨一点半晒“代码审查”现场,编排他的段子比疯狂星期四还多

    梦晨 Pine 发自 凹非寺 量子位 | 公众号 QbitAI 每一个真正会写代码的人,请在下午2点到总部10层报到。 每一个真正会写代码的人,请在下午2点到总部10层报到。 马斯…

    2022年11月21日
  • gfsoso(gfsoso是什么)

    eSCIHUB搜索引擎强大无比,只要有网就能下载你要的文献,无需购买数据库。 说到查资料大家最先想到的是各类搜索引擎提供的数据库,当然百度学术在一定程度上也能完成一些论文的查阅工作…

    2022年11月16日
  • 短视频脚本范文(视频脚本怎么写)

    短视频脚本,是故事的发展大纲。我们在拍摄视频前,需要在脚本中确定整个视频的整体框架。 事件发生的时间、地点,其中有哪些人物,每个人物有哪些台词、动作,每个画面拍摄的景别分别是什么,…

    2022年11月13日
  • 网站客服代码(网站客服代码实现移动端隐藏,电脑端展开)

    本文主要讲的是网站客服代码,以及和网站客服代码实现移动端隐藏,电脑端展开相关的知识,如果觉得本文对您有所帮助,不要忘了将本文分享给朋友。 在线客服系统代码是什么? 在线客服系统代码…

    2022年11月12日
  • 8字头股票什么意思(8字头股票什么意思呀)

    北京证券交易所股票是以4和8开头1北京证券交易所是以现有的新三板精选层为基础组建,进一步提升服务中小企业的能力,打造服务创新型中小企业主阵地北京证券交易所是因为我们国家要支持中小企…

    2022年11月11日
  • 数据透视表是干嘛的(透视表excel透视表怎么做)

    工作中经常要对物品进行进销存管理,今天分享一个简易的进销存管理,首先我们在有原始数据表,必备的几列数据如下所示: 在类型字段中,我们列出商品是入库,还是出库 然后我们可以按CTRL…

    2022年11月5日
  • 农行94账号是什么意思(农行账号04开头的是啥)

    94 交易失败,请稍后重试重新签到后再交易或与银行卡服务中心联系;额,跟你基本没什么关系,一般是批量业务会用到 ,比如说发工资什么的;农业银行存折账号是17位 其中前两位是省市代码…

    2022年11月4日
  • 收购Twitter后 马斯克计划重启短视频应用Vine

    据 Axios 报道,埃隆-马斯克已经要求 Twitter 的工程师们开始开发短视频应用 Vine 的新版本,并可能在年底前推出。马斯克昨天在推特上发布了一项调查,询问他是否应该“…

    2022年11月1日

联系我们

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