我们来描述一个这样的业务需求,首先有两个URL,/A:为获取用户详情信息包含用户的所有字段(用户名,密码),/B:为获取用户信息字段(只要用户名),怎么处理呢?可能会想到建一个USER类然后返回不同的属性。但是这样写法确实Low的一逼。@JsonView可以十分方便的解决以上问题。下面我来介绍一下@JsonView。
@JsonView是jackson json中的一个注解,Spring mvc同样支持这个注解,它的作用就是控制输入输出后的json。
一、 @JsonView的使用步骤
1、使用接口声明多个视图
2、在对象属性的get方法上指定视图
1import org.hibernate.validator.constraints.NotBlank; 2import com.fasterxml.jackson.annotation.JsonView; 3 4public class User { 5 6 //声明一般视图接口 只允许这个视图返回用户名属性 7 public interface UserSimpView{}; 8 //声明完整视图接口 允许返回用户名密码属性 由于集成了一般视图接口 含义是拥有了一般视图所具有的返回属性 9 public interface UserDetailView extends UserSimpView{}; 10 11 private Integer Id; 12 13 private String userName; 14 15 private String passWord; 16 17 public User() { 18 } 19 20 public User(Integer Id, String userName, String passWord) { 21 this.Id = Id; 22 this.userName = userName; 23 this.passWord = passWord; 24 } 25 26 @JsonView(UserSimpView.class) 27 public Integer getId() { 28 return Id; 29 } 30 31 public void setId(Integer id) { 32 Id = id; 33 } 34 35 @JsonView(UserSimpView.class) 36 public String getUserName() { 37 return userName; 38 } 39 40 public void setUserName(String userName) { 41 this.userName = userName; 42 } 43 @JsonView(UserDetailView.class) 44 public String getPassWord() { 45 return passWord; 46 } 47 48 public void setPassWord(String passWord) { 49 this.passWord = passWord; 50 } 51 52 @Override 53 public String toString() { 54 return "User [Id=" + Id + ", userName=" + userName + ", passWord=" + passWord + "]"; 55 } 56}
3、在controller上指定视图
1@RestController 2@RequestMapping("/user") 3public class UserController { 4 5 @GetMapping(produces="application/json;charset=UTF-8") 6 @JsonView(UserDetailView.class) 7 public List getUserAll(@RequestParam("token") String token){ 8 9 List<User> userList = new ArrayList<>(); 10 userList.add(new User(1,"二十岁以后特殊视图0","123456特殊视图")); 11 userList.add(new User(2,"二十岁以后特殊视图1","qweqwe特殊视图")); 12 userList.add(new User(3,"二十岁以后特殊视图2","asdgdd特殊视图")); 13 14 return userList; 15 }
二、 编写测试类
当我使用完整视图的情况下
1@RestController 2@RequestMapping("/user") 3public class UserController { 4 5 @GetMapping(produces="application/json;charset=UTF-8") 6 @JsonView(UserDetailView.class) 7 public List getUserAll(@RequestParam("token") String token){ 8 9 List<User> userList = new ArrayList<>(); 10 userList.add(new User(1,"二十岁以后特殊视图0","123456完整视图")); 11 userList.add(new User(2,"二十岁以后特殊视图1","qweqwe完整视图")); 12 userList.add(new User(3,"二十岁以后特殊视图2","asdgdd完整视图")); 13 14 return userList; 15 }
返回结果为:

当我使用特殊视图的情况下
1@RestController 2@RequestMapping("/user") 3public class UserController { 4 5 @GetMapping(produces="application/json;charset=UTF-8") 6 @JsonView(UserSimpView.class) 7 public List getUserAll(@RequestParam("token") String token){ 8 9 List<User> userList = new ArrayList<>(); 10 userList.add(new User(1,"二十岁以后特殊视图0","123456完整视图")); 11 userList.add(new User(2,"二十岁以后特殊视图1","qweqwe完整视图")); 12 userList.add(new User(3,"二十岁以后特殊视图2","asdgdd完整视图")); 13 14 return userList; 15 }
返回结果为:
