文章目录
SpringMVC过滤(指定返回)对象的某些属性
文章目录
想要了解Jackson相关注解可以直接到第二部分
为什么要过滤对象的某些属性
- 场景:在平时写代码的时候会遇到这样的情况,有实体类,User,这里面定义了User相关的所有信息,同时需要对外开放接口查询获得用户的信息,但是要根据信息的不同,写查询不同的信息的接口,分情况返回数据
- 我需要用户的基本信息,用户名,等级,头像,个人介绍之类的数据,那么不能将密码,余额之类的返回给前端,那么就需要在返回数据的时候过滤掉不需要返回的属性
- 使用工具:SpringMVC以及SpringMVC默认的Json解析,Jackson即可
方法以及代码如下
实体类代码
@Data
public class User {
private String username;
private String password;
private Date brithday;
private String headImage;
private Integer account;
private String address;
private String mobile;
}
Controller代码
@RestController
@RequestMapping("/user/")
public class UserController {
/**
* 获取用户基础信息
* @param username
* @return
*/
@GetMapping("base")
public User getUserBaseInfo(String username){
return User.builder().username("sa").account(213).headImage("http://sss.ss.com").
address("石家庄").password("123456").mobile("13776684587").build();
}
/**
* 获取用户收货地址信息
* @param username
* @return
*/
@GetMapping("address")
public User getUserAddressInfo(String username){
return User.builder().username("sa").account(213).headImage("http://sss.ss.com").
address("石家庄").password("123456").mobile("13776684587").build();
}
/**
* 获取用户密码信息
* @param username
* @return
*/
@GetMapping("pass")
public User getUserLoginInfo(String username){
return User.builder().username("sa").account(213).headImage("http://sss.ss.com").
address("石家庄").password("123456").mobile("13776684587").build();
}
}
相关方法以及注解,以及优劣
使用Jackson注解:@JosnIgnore
- 该注解一般使用在成员变量上,表示,在Jackson序列化的时候,忽略该属性。
- 使用情况:一些不需要返回给前端的属性可以使用该注解忽略掉
@Data
@Builder
public class User {
private String username;
@JsonIgnore
private String password;
private Date brithday;
private String headImage;
@JsonIgnore
private Integer account;
@JsonIgnore
private String address;
@JsonIgnore
private String mobile;
}
- 将不需要返回的属性在实体类标注出来,即可,弊端:忽略效果,全局起效,每个接口都会忽略掉该属性
使用注解@JsonView
- 该注解用于指定,序列化的视图规则,用于两个地方,一个是实体类的属性上,另外一个是controller的接口方法上
- 使用:
2.1 首先需要先建立视图(可以在实体类内部创立,也可以单独创建视图类)
private interface BaseView{
}
@JsonView(User.BaseView