利用Jackson的JsonFilter来实现动态过滤数据列。

也就是说,同一个实体,你配置了不同的@JsonFilter,通过Jackson展现的结果可以是不一样的。

举个栗子:

@lombok.Data
public class User{String username;String password;Integer age;String gender;String blog;
}

默认不做任何配置的话,通过Jackson序列化出来的结果是:

{"username" : "tomcatandjerry","password" : "123456","age" : 36,"gender" : "男","blog" : "http://www.cnblogs.com/tomcatandjerry/"
}

可是password不应该要展示,方法有多种:

方法1:在不想序列化的字段上加注解JsonProperty:

@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)//Jackson
@JSONField(serialize = false)//fastjson
String password;

方法2:

2.1在User类上面加注解JsonFilter:

@JsonFilter("non-password")
public class User {...
}

2.2 配置FilterProvider

测试方法&配置如下:

public class JsonFilterTest {private ObjectMapper setupJsonFilter(){ObjectMapper mapper = new ObjectMapper();String[] beanProperties = new String[]{"password"};String nonPasswordFilterName = "non-password";//需要跟User类上的注解@JsonFilter("non-password")里面的一致FilterProvider filterProvider = new SimpleFilterProvider().addFilter(nonPasswordFilterName, SimpleBeanPropertyFilter.serializeAllExcept(beanProperties));//serializeAllExcept 表示序列化全部,除了指定字段//filterOutAllExcept 表示过滤掉全部,除了指定的字段mapper.setFilterProvider(filterProvider);return mapper;}@Testpublic void testJsonFilter() throws JsonProcessingException {User user = new User();user.setUsername("tomcatandjerry");user.setPassword("123456");user.setAge(36);user.setGender("男");    System.out.println(setupJsonFilter().writeValueAsString(user));}
}

打印测试结果:

{"username" : "tomcatandjerry","age" : 36,"gender" : "男","blog" : "http://www.cnblogs.com/tomcatandjerry/"
}

小结:

看上去似乎使用@JsonProperty更简单。
但是当有一堆字段需要配置,而且整个项目都需要统一处理的时候,后者@JsonFilter是一个不错的选择。

扩展:

同一个API,如果我想不同的人看到不一样的结果呢?
比如同一个用户API,有的展示username+age, 有的展示username+gender等

这个时候JsonFilter就非常适合了。

有人可能会问:不对啊?一个对象只能配置一个JsonFilter,怎么动态切换不同的Filter?
对的,一个对象只能配置一个JsonFilter,但只要稍加修改,就能实现??

思路:
既然一个对象只能配置一个JsonFilter,那么靠一个对象来动态展示不同的属性是不可能的。
我们可以多写几个对象,都继承User对象,不同的子类里面使用不同的JsonFilter

@JsonFilter("normal-user")
public class UserNormal extends User{//空class,里面没有任何属性
}@JsonFilter("admin")
public class UserAdmin extends User{//空class,里面没有任何属性
}

利用Spring的切点,根据当前用户的角色,替换返回值为不同的子类

原本:
public class UserService{public User get(String id){}
}

利用切点(可以自定义注解,加到方法上,切在注解上面),替换返回的对象为子类:

具体需要用到的:

  1. 扫描并缓存子类
  2. @Aspect切点,@Around(value=“比如:自定义注解”)
  3. 利用反射,创建出子类对象,BeanUtils.copyProperties

这样看似调用userService.get(“id”)返回的是User对象,其实可能已经替换成某一个子类了。

在ObjectMapper配置多个Filter,就实现了动态展示不同属性,且对开发人员透明。

小结:

优点: 对开发透明
缺点:一个对象需要写多个子类,虽然是空class

这也算是一种数据列权限控制的一种解决方案吧。

利用Jackson的JsonFilter来实现动态过滤数据列(数据列权限控制)相关推荐

  1. 如何利用 C# 爬取带 Token 验证的网站数据?

    在对文本数据的情感分析中,基于情感词典的方法是最简单也是最常用的一种了. 它的大体思路如下: 对文档分词,找出文档中的情感词.否定词以及程度副词,然后判断每个情感词之前是否有否定词及程度副词,将它之前 ...

  2. 神技能!研究人员利用扫描仪成功从物理隔离设备中偷出数据

    本文讲的是神技能!研究人员利用扫描仪成功从物理隔离设备中偷出数据,近日,一组以色列研究人员设计了一种新技术,可以利用扫描仪通过受控恶意软件在气隙系统(air-gapped)中获取用户设备中的数据. 关 ...

  3. 【思维导图】利用LSTM(长短期记忆网络)来处理脑电数据

    文章来源| 脑机接口社区群友 认知计算_茂森的授权分享 在此非常感谢 认知计算_茂森! 本篇文章主要通过思维导图来介绍利用LSTM(长短期记忆网络)来处理脑电数据. 文章的内容来源于社区分享的文章&l ...

  4. 利用LSTM(长短期记忆网络)来处理脑电数据

    目录 LSTM 原理介绍 LSTM的核心思想 一步一步理解LSTM 代码案例 本分享为脑机学习者Rose整理发表于公众号:脑机接口社区 .QQ交流群:903290195 Rose小哥今天介绍一下用LS ...

  5. 利用partition分组查询 查询每个分组第一条数据

    利用partition分组查询 查询每个分组第一条数据 数据库:sqlserver (其他数据库没有尝试) row_number() over(partition by year(createtime ...

  6. Java下利用Jackson进行JSON解析和序列化

    Java下利用Jackson进行JSON解析和序列化 转载于:https://www.cnblogs.com/jing1617/p/7009122.html

  7. Py之pandas:利用where、replace等函数对dataframe格式数据按照条件进行数据替换

    Py之pandas:利用where.replace等函数对dataframe格式数据按照条件进行数据替换 目录 利用where.replace等函数对dataframe格式数据按照条件进行数据替换 利 ...

  8. ML之xgboost:利用xgboost算法对Boston(波士顿房价)数据集【特征列分段→独热编码】进行回归预测(房价预测)+预测新数据得分

    ML之xgboost:利用xgboost算法对Boston(波士顿房价)数据集[特征列分段→独热编码]进行回归预测(房价预测)+预测新数据得分 导读 对Boston(波士顿房价)数据集进行特征工程,分 ...

  9. java mysql 文本导入数据语句_Java利用MYSQL LOAD DATA LOCAL INFILE实现大批量导入数据到MySQL...

    Mysql load data的使用 数据库中,最常见的写入数据方式是通过SQL INSERT来写入,另外就是通过备份文件恢复数据库,这种备份文件在MySQL中是SQL脚本,实际上执行的还是在批量IN ...

最新文章

  1. ValueError: max() arg is an empty sequence
  2. 2020人工神经网络第一次作业-解答第一部分
  3. wp7使用Cocos2d-X for XNA制作一个塔防类游戏 (二)在游戏中加入地图和怪物。(上)
  4. 应用分析:CIO须注意SOA使用中的五大隐患
  5. 将数据转化为API,OpenDataSoft获540万美元A轮融资
  6. 相关的类代表的颜色和文本对齐方式
  7. 仅仅有人物没背景的图片怎么弄_五分钟写作课 人物篇 人物的出场是个关键时刻...
  8. 在 Java 中初始化 List 的五种方法
  9. L3-020 至多删三个字符 [DP]
  10. python集合类型运算符_Python 数据类型和运算符
  11. 1633: [Usaco2007 Feb]The Cow Lexicon 牛的词典(DP)
  12. [题解] 2038: [2009国家集训队]小Z的袜子(hose)
  13. 计算机组成原理期末复习整理 白中英版本
  14. 车牌识别easypr的详细介绍
  15. 原生Android用不了電信4g,给初中生准备的手机,在深圳地区用中国电信4G体验多亲Qin2 AI助手,开箱和使用体验...
  16. Android透明字体画法
  17. 【JavaScript】相关知识学习笔记
  18. 怎么验证mysql安装成功_mysql如何验证是否安装成功
  19. 洛谷1268树的重量(树)
  20. 缺少dll文件怎么办?修复dll文件的多种方法

热门文章

  1. 企业要搞数字化转型,是用一整套ERP,还是各搞各的数据系统?
  2. 给年终总结报告加分的技巧:手机上就能看的可视化长什么样?
  3. Python中的错误处理
  4. 有三角形的即时通讯源码?
  5. 哥哥被我打哭了的飞鸽传书
  6. 本人计划继续写飞鸽传书,支持的人有吗?
  7. 又不能起床python好学吗
  8. 面向对象的 飞鸽传书 思想
  9. 写给自己看的HTML、CSS、XHTML指南 八
  10. 《南方都市报》:三鹿集团300万摆平搜索引擎?