在 Spring 中使用 JsonView 响应多种数据

概述

举个例子,当我们需要一组用户信息列表的时候,如果当前api面向的是管理员方向,那么我们自然需要数据保持完整,如用户密码、用户手机号这些隐私信息。那么当面向的方向是用户方向呢?我们就需要去"隐藏"这些数据。

而使用JsonView之时,我们只需要在接口上设置对应的注解,来告诉这个接口应该以哪一种类型,去返回数据。

实现

首先创建一个实体类,并生成get/set方法。

public class User {
    private String UserName;
    private String PassWord;
    private String Phone;
    ...省略
}

然后在其中创建两个接口,分别代表普通视图和管理视图。很明显,在此次设计中管理视图自然包含普通视图的内容。

public interface DataForOrdinary{}
public interface DataForAdmin extends DataForOrdinary{}

然后在对应参数的get方法之上设置@JsonView,其值为刚才我们声明的两个接口。
如以下面PassWord参数,很显然,它应该只有在管理视图才会将其展示,因此我们为其"声明"为管理视图。

@JsonView(DataForAdmin.class)
public String getPassWord() {
    return PassWord;
}

其他参数则大同小异。

自此,便可以创建Controller层进行测试,值得注意的是,在此也需要使用注解对其声明。很明显,该接口实现的原理应该就是在此进行二次封装。

@GetMapping("/getUsersForAdmin")
@JsonView(User.DataForAdmin.class)
public List<User> getUsersForAdmin(){
    User user = new User("a", "v", "1111");
    List<User> list = new ArrayList<>();
    list.add(user);
    list.add(user);
    list.add(user);
    return list;
}
# Spring