前言
关于实体类的属性对用户的可见性问题, 我们第一时间可能会想到定义一个性的类, 里面只定义需要给用户看见的属性, 然后进行属性值拷贝
显然 这种做法极其不优雅, 实体类一旦增多, 后期维护会非常的累
那有没有轻松一点的方法呢, 能不能某个表的实体类就只创建一个, 然后复用呢
答案是 有的
我们可以使用注解来实现, 根据不同的需求, 选择不同的注解, 具体如下:
需求一
用户在请求接口的时候, 实体类中的某些字段不给用户返回(序列化), 同时也不允许用户传值(反序列化), 比如大部分的实体类中我们都会有createTime
和updateTime
字段, 像这种是不需要给用户返回的, 同时也不允许用户传值
那么此时我们就可以用到jackson
包中的@JsonIgnore
注解来实现这一功能, 具体示例代码如下:
1 |
|
使用该注解后, 哪怕用户刻意传了也不影响数据, 无论用户传与不传都写入的都是默认值
如果我们需要对多个字段进行可见性隐藏, 除了挨个属性添加@JsonIgnore
, 我们还可以在类中使用@JsonIgnoreProperties
注解来忽略某个属性, 其效果和@JsonIgnore
一样, 具体示例代码如下:
1 |
|
需求二
用户在请求接口的时候, 实体类中的某些字段需要给用户返回, 但是不允许用户传值, 比如id
字段, 那此时我们可以在类中使用@JsonIgnoreProperties
注解, 并设置allowGetters = true
即可, 具体代码如下:
1 |
|
需求三
用户在请求接口的时候, 实体类中的某些字段不给用户返回, 但是允许用户传值, 那此时我们可以在类中使用@JsonIgnoreProperties
注解, 并设置allowSetters = true
即可, 具体代码如下:
1 |
|
需求四
用户在请求接口的时候, 实体类中的某些字段不给用户返回, 但是允许用户传值, 同时另外某些字段需要给用户返回, 但是不允许用户传值, 这种又该怎么办呢, 此时我们需要用到另外一个注解@JsonProperty
, 在这个注解中配置access
值, 具体代码如下:
1 |
|
这样一来, 我们在实现id
字段只读的同时, 又实现了content
字段的可写入但不可见
access
属性常用选项:
JsonProperty.Access.WRITE_ONLY
: 只允许用户传值, 但不给用户返回JsonProperty.Access.READ_ONLY
: 只给用户返回该字段, 但不允许用户传值
需要注意的是: @JsonProperty(access = JsonProperty.Access.READ_ONLY
注解放置在父类的属性中无效. 具体原因我也不是太清楚
需求五
假如需要给客户端出两个用户接口, 一个只返回用户名, 另一个返回用户名和用户id
, 那这种情况下上面的方案就不适用了, 此时我们需要用到注解@JsonView
, 分别作用在属性和Controller
中的具体接口方法上, 代码如下:
实体类:
1 |
|
Controller类:
1 |
|
此时如果你运行程序请求接口发现返回一个空对象{}
, 这是由于没有配置objectMapper
, 我们需要在WebConfig
中进行配置, 具体代码如下:
1 |
|
上面WebConfig
类是我自己创建的, 你如果没有该类则手动创建一个,继承WebMvcConfigurer
, 别忘了添加@Configuration
注解
本文为作者原创转载时请注明出处 谢谢