spring-mvc序列化json动态擦除属性

上传人:第*** 文档编号:32697480 上传时间:2018-02-12 格式:DOCX 页数:12 大小:33.51KB
返回 下载 相关 举报
spring-mvc序列化json动态擦除属性_第1页
第1页 / 共12页
spring-mvc序列化json动态擦除属性_第2页
第2页 / 共12页
spring-mvc序列化json动态擦除属性_第3页
第3页 / 共12页
spring-mvc序列化json动态擦除属性_第4页
第4页 / 共12页
spring-mvc序列化json动态擦除属性_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《spring-mvc序列化json动态擦除属性》由会员分享,可在线阅读,更多相关《spring-mvc序列化json动态擦除属性(12页珍藏版)》请在金锄头文库上搜索。

1、项目结构:spring-mvc + mybaties(annotation-driven) , 返回给客户端序列化的 json 串问题背景:由于项目本身性质,后台程序返回给前台的时候,返回了一大堆没用的属性。为了节约网络流量,需要对多余的属性进行擦除,最简单的办法就是在将要序列化的对象的属性设置为空,然后再序列化的时候排除空属性即可(当然也可以自己实现一个序列化插件,我比较懒,就用这种方法了) 。由于这个业务是整个系统所公用的,所以考虑提取一个公共的方法,动态去擦除属性。问题解决方案:查阅了网上一些资料,综合对比了一下,决定在 controller 外面加一个 AOP 代理拦截。在拦截器的Ar

2、ound 方法里面对 controller 返回的结果进行统一的擦除。基本思路:1、 给需要序列化的对象(例如,对象 A)添加一种使用场景,使用注解在这个对象上面指定每一种场景需要保留或者需要擦除哪些属性2、 每个使用到这个对象 A 的方法,都需要指定这个对象的场景。3、 通用的 AOP 根据这个场景,来查找到想要保留、擦除的属性,然后通过给属性设置空值进行擦除。4、 场景跟要保留或者擦除的属性得映射,可以通过注解,也可以通过配置文件,本质上是差不多的,这里采用注解。通用组件共有这些类:代码:JsonFilter.java,这个类是场景和属性映射的集合package com.test.json

3、;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;Retention(RetentionPolicy.RUNTIME)Target(ElementType.TYPE)public interface JsonFilter public JsonFilterEntry value();JsonFilterEntry.java,每个场景

4、对应一个这个注解,这个注解是场景与属性的映射package com.test.json;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;/* 指示需要擦除哪些属性* * 如果指定了 includes, 则以 includes 为准* 如果未指定 includes,指定了 excludes,则以 excludes 为准* 如果都没有指定,则不擦除任何属性* * author wisdom*/Retention(RetentionPolicy.RUNTIME)public inter

5、face JsonFilterEntry /* key* return*/public String key() default basic;/* 保留哪些属性 * return*/public String includes() default ;/* 排除哪些属性* return*/public String excludes() default ;Eraseable.java,实现了这个接口的类才可以被擦除,否则不被擦除。这个接口返回一个type,擦除的时候根据这个 type 去查找保留或者删除的属性。package com.test.json;public interface Eras

6、eable public String getEraseType();JsonFilterParser.java, 用来扫描指定的包里面的类,获取到关心的注解package com.test.json;import java.util.Arrays;import java.util.HashMap;import java.util.LinkedList;import java.util.List;import java.util.Map;import com.test.dal.util.PackageScan;public class JsonFilterParser private stat

7、ic final Map ANNOTATION_MAP = new HashMap();/* 预先把这些东西加载上, 这个方法一般在系统启动的时候调用一次即可* param packages*/public static synchronized void reload(String packages)if(packages != null & packages.length 0)List classes = new LinkedList();for(String p : packages)classes.addAll(PackageScan.getClassNames(p, true); i

8、f(classes.size() 0 & ANNOTATION_MAP.size() 0)ANNOTATION_MAP.clear();for(String s : classes)parseClass(s); /* 解析* param classpath*/SuppressWarnings(rawtypes, unchecked)private static void parseClass(String classpath)if(ANNOTATION_MAP.containsKey(classpath)return; try Class clazz = Thread.currentThrea

9、d().getContextClassLoader().loadClass(classpath);if(clazz != null)JsonFilter filters = (JsonFilter) clazz.getAnnotation(JsonFilter.class);if(filters != null)JsonFilterEntry entrys = filters.value();Map map = new HashMap();for(JsonFilterEntry entry : entrys)String key = entry.key();JsonFilterEntity e

10、n = new JsonFilterEntity();en.setKey(key);en.getIncludes().addAll(Arrays.asList(entry.includes();en.getExcludes().addAll(Arrays.asList(entry.excludes();map.put(key, en);ANNOTATION_MAP.put(classpath, map); catch (ClassNotFoundException e) e.printStackTrace();public static Map getFilters(String classp

11、ath)return ANNOTATION_MAP.get(classpath);public static JsonFilterEntity getFilter(String classpath, String type)Map m = getFilters(classpath);if(m != null)return m.get(type);return null;public static void main(String args) reload(new Stringcom.test.bean.ext);JsonFilterEntity.java, 一个数据结构,用于缓存 JsonFi

12、lterEntry 的值package com.test.json;import java.util.HashSet;import java.util.Set;public class JsonFilterEntity private String key;private Set includes = new HashSet();private Set excludes = new HashSet();public String getKey() return key;public void setKey(String key) this.key = key;public Set getInc

13、ludes() return includes;public void setIncludes(Set includes) this.includes = includes;public Set getExcludes() return excludes;public void setExcludes(Set excludes) this.excludes = excludes;BeanEraseUtil.java,擦除的工具类,用的时候,调用 BeanEraseUtil.erase(obj)即可package com.test.json;import java.beans.BeanInfo;

14、import java.beans.IntrospectionException;import java.beans.Introspector;import java.beans.PropertyDescriptor;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.Collection;import java.util.Map;import java.util.Set;import java.util.concurrent.Concurrent

15、HashMap;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import com.test.ww.util.BeanUtil;import com.test.ww.util.StringUtil;public class BeanEraseUtil private static final Logger logger = LoggerFactory.getLogger(BeanUtil.class); private static final Object EMPTY_ARRAY_WRITE=new Objectnull;private static final Object EMPTY_ARRAY_READ=new Object;private static final Map,PropertyDescriptor map=new ConcurrentHashMap,PropertyDescriptor();public static PropertyDescriptor getPropDescs(Class c) throws IntrospectionExceptionPropertyDescriptor propDescs=map.get(c);if(propDescs=null)

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 中学教育 > 职业教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号