欢迎来到天天文库
浏览记录
ID:40499675
大小:33.51 KB
页数:12页
时间:2019-08-03
《spring-mvc序列化json动态擦除属性》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、项目结构:spring-mvc+mybaties(annotation-driven),返回给客户端序列化的json串问题背景:由于项目本身性质,后台程序返回给前台的时候,返回了一大堆没用的属性。为了节约网络流量,需要对多余的属性进行擦除,最简单的办法就是在将要序列化的对象的属性设置为空,然后再序列化的时候排除空属性即可(当然也可以自己实现一个序列化插件,我比较懒,就用这种方法了)。由于这个业务是整个系统所公用的,所以考虑提取一个公共的方法,动态去擦除属性。问题解决方案:查阅了网上一些资料,综合对比了一下,决定在controller
2、外面加一个AOP代理拦截。在拦截器的@Around方法里面对controller返回的结果进行统一的擦除。基本思路:1、给需要序列化的对象(例如,对象A)添加一种使用场景,使用注解在这个对象上面指定每一种场景需要保留或者需要擦除哪些属性2、每个使用到这个对象A的方法,都需要指定这个对象的场景。3、通用的AOP根据这个场景,来查找到想要保留、擦除的属性,然后通过给属性设置空值进行擦除。4、场景跟要保留或者擦除的属性得映射,可以通过注解,也可以通过配置文件,本质上是差不多的,这里采用注解。通用组件共有这些类:代码:JsonFilter.
3、java,这个类是场景和属性映射的集合packagecom.test.json;importjava.lang.annotation.ElementType;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;importjava.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)public@interface
4、JsonFilter{publicJsonFilterEntry[]value();}JsonFilterEntry.java,每个场景对应一个这个注解,这个注解是场景与属性的映射packagecom.test.json;importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;/***指示需要擦除哪些属性**如果指定了includes,则以includes为准*如果未指定includes,指定了excludes,则以exclude
5、s为准*如果都没有指定,则不擦除任何属性**@authorwisdom**/@Retention(RetentionPolicy.RUNTIME)public@interfaceJsonFilterEntry{/***key*@return*/publicStringkey()default"basic";/***保留哪些属性*@return*/publicString[]includes()default{};/***排除哪些属性*@return*/publicString[]excludes()default{};}Erasea
6、ble.java,实现了这个接口的类才可以被擦除,否则不被擦除。这个接口返回一个type,擦除的时候根据这个type去查找保留或者删除的属性。packagecom.test.json;publicinterfaceEraseable{publicStringgetEraseType();}JsonFilterParser.java,用来扫描指定的包里面的类,获取到关心的注解packagecom.test.json;importjava.util.Arrays;importjava.util.HashMap;importjava.ut
7、il.LinkedList;importjava.util.List;importjava.util.Map;importcom.test.dal.util.PackageScan;publicclassJsonFilterParser{privatestaticfinalMap>ANNOTATION_MAP=newHashMap>();/***预先把这些东西加载上,这个方法一般在系统启动的
8、时候调用一次即可*@parampackages*/publicstaticsynchronizedvoidreload(String[]packages){if(packages!=null&&packages.length>0){L
此文档下载收益归作者所有