- 前言
在Java开发中有时候某些敏感信息咱们须要屏蔽掉,不能被生产这些数据的客户端晓得。通常状况下咱们会将其设置为null
或者空字符 ""
,其实还有其它方法,如果你应用了Jackson的话。接下来我将以一个理论场景来通知你能够怎么做。
- Jackson如何疏忽字段
这里都以JSON序列化为例。如果咱们在业务中须要返回用户信息,已有的POJO是这样的:
import lombok.Data;/** * @author felord.cn */@Datapublic class UserInfo { /** * userid */ private String userId; /** * 用户名 */ private String username; /** * 密钥串 */ private String secret; /** * 地址信息 */ private String address;}复制代码
业务场景:第三方通过用户的userId
来获取用户的信息,然而密钥串secret
显然不能让第三方晓得,通常最容易想到的办法是将secret
字段设置为null
或者""
。如果业务须要批量提供用户信息,即List<UserInfo>
,咱们总不能每次都要遍历一遍吧。Spring Boot内置的Jackson能够很不便的帮咱们解决这个问题。
应用@JsonIgnore注解
Jackson提供了一个@JsonIgnore
注解,将它标记到须要被疏忽的字段上或者对应的getter
办法或者setter
办法上就能够实现对该字段的屏蔽。就像上面这样标记:
@JsonIgnore private String secret; // 对应json 样例 {"userId":"100000","username":"felord.cn","address":"cn"}复制代码
无论是序列化(将POJO转为JSON)还是反序列化((将JSON转为POJO),secret
都会被疏忽。
应用@JsonIgnoreProperties注解
这个注解比@JsonIgnore
更加弱小一些,通常该注解标记到POJO之上,它有更多的能力:
- 疏忽多个字段,配置
value
属性即可。 - 疏忽未知的属性,配置
ignoreUnknown
为true
,默认不疏忽。 - 容许疏忽字段被序列化,配置
allowGetters
为true
,序列化的时候不会被疏忽。 - 容许疏忽字段被反序列化,配置
allowSetters
为true
,反序列化的时候不会被疏忽。
例如咱们要疏忽UserInfo
中的secret
和address
,咱们能够这样配置:
@JsonIgnoreProperties({"secret", "address"})复制代码
应用@JsonProperty注解
须要Jackson版本不低于2.6
这个注解出镜率还是十分高的,通常为了给JSON的字段起别名或者设置默认值应用。比方UserInfo
中的userId
想对应JSON中的user_id
,咱们能够:
@JsonProperty(value = "user_id")private String userId;复制代码
在2.6版本当前,这个注解也能实现疏忽字段的作用。它有个access
属性,用来指定在序列化(“读取”)和反序列化(“写”)期间拜访权限(这里的读写是以属性为视角)。它由枚举Access
定义:
public enum Access { /** * 无论是序列化还是反序列化都会依据配置主动的解决,默认值。 */ AUTO, /** * 意味着该属性只能在进行序列化时读取(通过“ getter”办法拜访的值,或者从字段中读取),而在反序列化 * 期间不能写入(设置)。换句话说,这将反映“只读POJO”,其中蕴含的值能够读取但不能写入。 */ READ_ONLY, /** * 意味着该属性只能作为反序列化的一部分写入(设置)(应用“ setter”办法,或调配给Field,或作为 * Creator参数传递),而不会被读取(获取)以进行序列化,即,该属性的值不包含在序列化中。 */ WRITE_ONLY, /** * 可读可写,READ_ONLY与WRITE_ONLY的合并成果。 */ READ_WRITE;}复制代码
从这个注解中咱们能够晓得,如果你想在POJO转JSON时疏忽secret
字段,就能够这么写:
@JsonProperty( access = JsonProperty.Access.WRITE_ONLY)private String secret;复制代码
应用@JsonIgnoreType注解
这个注解是用来间接疏忽类型的,如果下面的UserInfo
是另外一个POJO的属性,咱们不心愿它被序列化和反序列化,那么就能够:
@JsonIgnoreTypepublic class UserInfo { // 省略}复制代码
- 总结
目前大略可知的Jackson有这么四种的疏忽属性的形式,它们有各自的应用场景,你能够依据本人的状况抉择应用。
参考:《2020最新Java根底精讲视频教程和学习路线!》
链接:https://juejin.cn/post/692485...