使用JsonView,减少vo的数量

来源:互联网 发布:树莓派python串口编程 编辑:程序博客网 时间:2024/04/30 11:29

前言:

在我们的开发中,经常会有这样的情景,后台从数据库中查询到前端需要的数据后,就会返回给前端,此时,我们就会封装一个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的使用,同时也会减少大量的重复代码。

阅读全文
0 0