当我们使用SpringMVC做controller进行查询信息,以Json的数据格式返回前端时,Json数据中常常涉及到一些用户名密码的查询,但出于安全性的考虑,我们可能不需要将用户对象User的所有信息(例如:密码)返回给前端。当我们使用@RestController注解时,返回的User对象则被自动转成了对应的Json数组传输给前端,我们无法将其密码等不必要的Json信息除去后再返回,为了解决这个Json数据的控制问题,我们可以使用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
方法上指定视图(也可以在 字段名上面直接指定视图,结果是一样的)
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;
}
}
get
方法上指定视图,也可以 直接在 字段名上 指定视图,一个字段可以同时指定多个视图,例:@JosnView({
UserInterface1.class,
UserInterface2.class,...
})