一、我们常常遇到这样的业务场景:
当我们使用SpringMVC做controller进行查询信息,以Json的数据格式返回前端时,Json数据中常常涉及到一些用户名密码的查询,但出于安全性的考虑,我们可能不需要将用户对象User的所有信息(例如:密码)返回给前端。当我们使用@RestController注解时,返回的User对象则被自动转成了对应的Json数组传输给前端,我们无法将其密码等不必要的Json信息除去后再返回,为了解决这个Json数据的控制问题,我们可以使用JsonView注解进行开发。
@GetMapping("/user")
public List<User> query(UserQueryCondition condition,@PageableDefault(page=2,size=17,sort="username,asc") Pageable pageable){//用spring自带的pageable对象来得到分页信息
System.out.println(ReflectionToStringBuilder.toString(condition, ToStringStyle.MULTI_LINE_STYLE));
System.out.println(pageable.getPageSize());
System.out.println(pageable.getPageNumber());
System.out.println(pageable.getSort());
List<User> users = new ArrayList<>();
users.add(new User());
users.add(new User());
users.add(new User());
return users;
}
二、@JsonView注解的使用步骤
1.使用接口来声明多个视图
User.java(实体类)
public class User {
/**
创建两个接口,
一个为用户简单视图,即精简版的Json数据视图。
另一个为用户详细视图,即完整版的Json数据视图
**/
//用户简单视图
public interface UserSimpleView{}
//用户详细视图(继承用户简单视图)
public interface UserDetailView extends UserSimpleView{}
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
2.在值对象的get方法上指定视图
User,java(实体类)
public class User {
/**
创建两个接口,
一个为用户简单视图,即精简版的Json数据视图。
另一个为用户详细视图,即完整版的Json数据视图
**/
//用户简单视图
public interface UserSimpleView{}
//用户详细视图(继承用户简单视图)
public interface UserDetailView extends UserSimpleView{}
private String username;
private String password;
//Json简单视图/详细视图都需要username用户名这个属性,所以加在这个get方法上
@JsonView(UserSimpleView.class)
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
//Json简单视图不需要password密码这个属性,所以不加在这个get方法上
//Json详细视图需要password密码这个属性,所以加在这个get方法上
@JsonView(UserDetailView.class)
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
3.在Controller方法上指定视图
UserController.java(Controller方法类)
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping
//使用@JsonView注解加在Controller方法上表面这个方法返回的Json数据为简单视图(不显示密码)
@JsonView(User.UserSimpleView.class)
public List<User> query(UserQueryCondition condition,@PageableDefault(page=2,size=17,sort="username,asc") Pageable pageable){
System.out.println(ReflectionToStringBuilder.toString(condition, ToStringStyle.MULTI_LINE_STYLE));
System.out.println(pageable.getPageSize());
System.out.println(pageable.getPageNumber());
System.out.println(pageable.getSort());
List<User> users = new ArrayList<>();
users.add(new User());
users.add(new User());
users.add(new User());
return users;
}
@GetMapping("/{id:\\d+}")
//使用@JsonView注解加在Controller方法上表面这个方法返回的Json数据为详细视图(显示用户名和密码)
@JsonView(User.UserDetailView.class)
public User getInfo(@PathVariable String id){
User user = new User();
user.setUsername("tom");
return user;
}
}