使用JsonView,减少vo的数量

前言:

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

你可能感兴趣的:(spring)