前言
各位同学可能遇到过下述问题,在项目开发中,后端是以json格式的数据返回给前端,但是对于数据为空的字段,可能出现null,这让前端同学很痛苦,于是他们想,针对那些为null的字段,后端能不能把string类型的数据返回空字符串,int类型的数据返回0,集合和数组返回[],这样多方便呢!
ok,既然这样的话就满足他们的要求,本文利用spring自带的json转化器,将返回给前端的数据进行处理,见下文所示。
一、编写json数据转化器
/** * @作者 yangs * @日期 2022/1/20 * @描述 json数据转化器 */ public class jacksonhttpmessageconverter extends mappingjackson2httpmessageconverter { /** * 处理数组类型的null值 */ public class nullarrayjsonserializer extends jsonserializer<object> { @override public void serialize(object value, jsongenerator jgen, serializerprovider provider) throws ioexception, jsonprocessingexception { if (value == null) { jgen.writestartarray(); jgen.writeendarray(); } } } /** * 处理字符串类型的null值 */ public class nullstringjsonserializer extends jsonserializer<object> { @override public void serialize(object o, jsongenerator jsongenerator, serializerprovider serializerprovider) throws ioexception, jsonprocessingexception { jsongenerator.writestring(stringutils.empty); } } /** * 处理数字类型的null值 */ public class nullnumberjsonserializer extends jsonserializer<object> { @override public void serialize(object o, jsongenerator jsongenerator, serializerprovider serializerprovider) throws ioexception, jsonprocessingexception { jsongenerator.writenumber(0); } } /** * 处理布尔类型的null值 */ public class nullbooleanjsonserializer extends jsonserializer<object> { @override public void serialize(object o, jsongenerator jsongenerator, serializerprovider serializerprovider) throws ioexception, jsonprocessingexception { jsongenerator.writeboolean(false); } } public class mybeanserializermodifier extends beanserializermodifier { @override public list<beanpropertywriter> changeproperties(serializationconfig config, beandescription beandesc, list<beanpropertywriter> beanproperties) { //循环所有的beanpropertywriter for (object beanproperty : beanproperties) { beanpropertywriter writer = (beanpropertywriter) beanproperty; //判断字段的类型,如果是array,list,set则注册nullserializer if (isarraytype(writer)) { //给writer注册一个自己的nullserializer writer.assignnullserializer(new nullarrayjsonserializer()); } else if (isnumbertype(writer)) { writer.assignnullserializer(new nullnumberjsonserializer()); } else if (isbooleantype(writer)) { writer.assignnullserializer(new nullbooleanjsonserializer()); } else if (isstringtype(writer)) { writer.assignnullserializer(new nullstringjsonserializer()); } } return beanproperties; } /** * 是否是数组 */ private boolean isarraytype(beanpropertywriter writer) { class<?> clazz = writer.gettype().getrawclass(); return clazz.isarray() || collection.class.isassignablefrom(clazz); } /** * 是否是string */ private boolean isstringtype(beanpropertywriter writer) { class<?> clazz = writer.gettype().getrawclass(); return charsequence.class.isassignablefrom(clazz) || character.class.isassignablefrom(clazz); } /** * 是否是int */ private boolean isnumbertype(beanpropertywriter writer) { class<?> clazz = writer.gettype().getrawclass(); return number.class.isassignablefrom(clazz); } /** * 是否是boolean */ private boolean isbooleantype(beanpropertywriter writer) { class<?> clazz = writer.gettype().getrawclass(); return clazz.equals(boolean.class); } } public jacksonhttpmessageconverter() { getobjectmapper().setserializerfactory(getobjectmapper().getserializerfactory().withserializermodifier(new mybeanserializermodifier())); } }
二、编写mvc配置文件
接下来我们要写一个mvc的配置类,继承webmvcconfigurationsupport类,并重写configuremessageconverters()方法,在这里方法中,我们要把上面定义的json转换工具加载进来,来实现我们想要的功能。
/** * @作者 yangs * @日期 2022/1/20 * @描述 mvc的配置类 */ @configuration public class webmvcconfig extends webmvcconfigurationsupport { // 文件映射路径 @value("${filemappingpath}") private string filemappingpath; /** * @作者 yangs * @日期 2022/1/20 * @描述 返回给前端的json格式转化器 */ @override protected void configuremessageconverters(list<httpmessageconverter<?>> converters) { super.configuremessageconverters(converters); converters.add(new jacksonhttpmessageconverter()); } }
到目前为止,我们已经实现了想要的功能,把string类型的null转成"",把integer类型的null转成0,把空集合和数组转成[]。
但是继承webmvcconfigurationsupport后,可能会出现一些坑,比如静态资源获取的问题。
继续往下看,没准可以防止埋雷。
三、防雷警告
继承webmvcconfigurationsupport类会使application.yml中配置的静态资源映射失效,如果你在配置文件中配置了如下代码
一定要警惕:
spring: mvc: static-path-pattern: /image/** resources: static-locations: file:e:/picture/
当我们继承webmvcconfigurationsupport类时,会是配置文件的静态资源映射失效,所以我们需要另一种解决方法,只需在webmvcconfigurationsupport的子类中重写addresourcehandlers()方法即可
如下所示:
/** * @作者 yangs * @日期 2022/1/20 * @描述 mvc的配置类 */ @configuration public class webmvcconfig extends webmvcconfigurationsupport { /** * @作者 yangs * @日期 2022/1/20 * @描述 返回给前端的json格式转化器 */ @override protected void configuremessageconverters(list<httpmessageconverter<?>> converters) { super.configuremessageconverters(converters); converters.add(new jacksonhttpmessageconverter()); } // 文件映射路径 @value("${filemappingpath}") private string filemappingpath; /** * @作者 yangs * @日期 2022/1/20 * @描述 配置静态资源访问路径 */ @override protected void addresourcehandlers(resourcehandlerregistry registry) { //通过image获取静态资源 registry.addresourcehandler("/image/**").addresourcelocations(filemappingpath); } }
你也可以查看我的另一篇文章,查阅如何在springboot中访问本地的静态资源,springboot访问本地静态资源。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论