使用JsonView,减少vo的数量

时间:2022-06-20 18:25:55

前言:

在我们的开发中,经常会有这样的情景,后台从数据库中查询到前端需要的数据后,就会返回给前端,此时,我们就会封装一个vo,用来传输结果,例如一个StudentVo类,里面有姓名,班级,年级等信息,另一个业务接口需要的字段和StudentVo类里面的字段类似,只是多了两个字段而已,一般的做法是,会另外建一个vo类,然后将vo类和StudentVo类里面公用的部分提取到另一个基类中,供继承。今天来介绍一种全新的处理方法,@JsonView

1、新建一个Vo

public class User {

private String userName;

private String password;

private String address;

private String age;

private String sex;
}

2、建两个controller

@GetMapping("/jsonview")// 需求:展示User里面的全部信息
public User jsonDetailViewController(){
User u = new User();
u.setAddress("chongqing");
u.setAge("25");
u.setPassword("123456");
u.setSex("nan");
u.setUserName("chhliu");
return u;
}

@GetMapping("/jsonviews")// 需求,只展示User里面的userName字段
public User jsonSimpleViewController(){
User u = new User();
u.setAddress("chongqing");
u.setAge("25");
u.setPassword("123456");
u.setSex("nan");
u.setUserName("chhliu");
return u;
}

现在的需求很清楚了,一个需要展示全部的字段信息,另一个只需要展示userName字段的信息,怎么实现了?

该@JsonView登场了


3、在User这个vo里面新建两个接口

该接口没有什么实质性的意义,主要起到一个区分的效果,该接口可以根据服务来建。

4、根据接口的不同,来决定哪个业务接口需要展示哪些字段,如下:

public class User {

public interface ServiceGroup1{};// 接口一:用于仅展示userName字段

public interface ServiceGroup2 extends ServiceGroup1 {};// 接口二,继承自接口一,用于展示全部的字段

@JsonView(ServiceGroup1.class)// 通过@JsonView+接口,来决定该字段在哪个业务里面展示
private String userName;

@JsonView(ServiceGroup2.class)
private String password;

@JsonView(ServiceGroup2.class)
private String address;

@JsonView(ServiceGroup2.class)
private String age;

@JsonView(ServiceGroup2.class)
private String sex;
}

5、在controller里面显示的标注

@GetMapping("/jsonview")
@JsonView(User.ServiceGroup1.class)// 该controller里面展示的是ServiceGroup1标注的字段
public User jsonDetailViewController(){
User u = new User();
u.setAddress("chongqing");
u.setAge("25");
u.setPassword("123456");
u.setSex("nan");
u.setUserName("chhliu");
return u;
}

@GetMapping("/jsonviews")// 该controller里面展示的是ServiceGroup2标注的字段
@JsonView(User.ServiceGroup2.class)
public User jsonSimpleViewController(){
User u = new User();
u.setAddress("chongqing");
u.setAge("25");
u.setPassword("123456");
u.setSex("nan");
u.setUserName("chhliu");
return u;
}

6、测试结果如下:

{"userName":"chhliu"}
{"userName":"chhliu","password":"123456","address":"chongqing","age":"25","sex":"nan"}

从上面的测试结果中,很容易看出,两个controller返回的结果是不一样的,尽管都是return u。通过上面的示例,在我们的实际生产中,可以通过这种方式,来减少vo的使用,同时也会减少大量的重复代码。