com.fasterxml.jackson.annotation.JsonView
@JsonView是jackson json中的一个注解,SpingMVC也支持这个注解
此注解的主要用途就是当你返回实体类时去除敏感信息。比如:有个user表里面有个pwd字段,查询出user后,不想返回pwd字段,可以使用此注解去除pwd字段。
@Target({ElementType.ANNOTATION_TYPE, ElementType.METHOD, ElementType.FIELD,
ElementType.PARAMETER, // since 2.5
ElementType.TYPE // since 2.9, to indicate "default view" for properties
})
@Retention(RetentionPolicy.RUNTIME)
@JacksonAnnotation
public @interface JsonView {
/**
* View or views that annotated element is part of. Views are identified
* by classes, and use expected class inheritance relationship: child
* views contain all elements parent views have, for example.
*/
public Class>[] value() default { };
}
- 使用接口来声明多个视图
- 在值对象的get方法上指定视图
- 在Controller方法上指定视图
public class User {
private String username;
private String password;
private Integer age;
@JsonView注解不是Spring的,它位于jackson-annotation包中
作用:SpringMvc使用@ResponseBody将结果以json返回客户端,有些实体类的某些字段可以不被包括在JSON中
使用情形:有多方调用这个接口,需要针对不同业务场景返回不同形式的JSON,但是这种情况的话 只拷贝需要的属性 再返回也能达到目的,但是这样没有逼格
在查询列表请求中,不返回password字段
在获取用户详情中,返回password字段
public class User {
/**
* 用户简单视图
*/
public interface UserSimpleView{};
/**
* 用户详情视图
*/
public interface UserDetailView extends UserSimpleView{};
private String username;
private String password;
private Integer age;
public User() {}
public User(String username, String password, Integer age) {
this.username = username;
this.password = password;
this.age = age;
}
@JsonView(UserSimpleView.class)
public String getUsername() { return username; }
@JsonView(UserDetailView.class)
public String getPassword() {return password;}
@JsonView(UserSimpleView.class)
public Integer getAge(){return age;}
public void setUsername(String username) { this.username = username; }
public void setPassword(String password) { this.password = password; }
public void setAge(Integer age) { this.age = age; }
}
- 这里完成了步骤1和步骤2
- 定义了步骤1的两个视图接口
UserSimpleView
和UserDetailView
,UserDetailView
继承UserSimpleView
,UserDetailView
拥有视图UserSimpleView
的属性- 完成了步骤2的在相应的get方法上声明JsonView
/**
* 在查询列表请求中,不返回password字段
* http://localhost:8080/user/
*/
@GetMapping("/user")
@JsonView({User.UserSimpleView.class})
public List query(){
//...
List users = new ArrayList<>();
users.add(new User("蔡徐坤","666",18));
users.add(new User("乔碧萝","999",58));
return users;
}
/**
* 在获取用户详情中,返回password字段
* http://localhost:8080/user/乔碧萝
*/
@GetMapping("/user/{userName}")
@JsonView(User.UserDetailView.class)
public User get(@PathVariable String userName){
if("乔碧萝".equals(userName)){
return new User("乔碧萝","999",58);
}else {
return new User("没有这个用户",null,null);
}
}
完成步骤3,在不同Controller的方法上使用视图
没有@JsonView注释的方法不会返回对应的字段
@JsonView 注释在set方法上效果也是一样的
@JsonView(UserSimpleView.class)
public void setUsername(String username) { this.username = username; }
@JsonView(UserDetailView.class)
public void setPassword(String password) { this.password = password; }
@JsonView(UserSimpleView.class)
public void setAge(Integer age) { this.age = age; }
public String getUsername() { return username; }
public String getPassword() {return password;}
public Integer getAge(){return age;}
前面我们每个字段的get或set方法都需要加@JsonView,这样也太麻烦了。把@JsonView加在类上就能解决这个问题
放在实体类上作为一种默认的视图。比如我们上面的User实体类,在实体类上加上@JsonView(User.UserSimpleView.class),这就是表明凡是返回User的地方如果没有显示指定所需要返回的视图,则默认使用BaseView视图。
@JsonView(User.UserSimpleView.class)
public class User {
/**
* 用户简单视图
*/
public interface UserSimpleView{};
/**
* 用户详情视图
*/
public interface UserDetailView extends UserSimpleView{};
private String username;
private String password;
private Integer age;
public User() {}
public User(String username, String password, Integer age) {
this.username = username;
this.password = password;
this.age = age;
}
@JsonView(UserDetailView.class)
public String getUsername() { return username; }
public String getPassword() {return password;}
public Integer getAge(){return age;}
public void setUsername(String username) { this.username = username; }
public void setPassword(String password) { this.password = password; }
public void setAge(Integer age) { this.age = age; }
}
- https://www.jianshu.com/p/dab9dae5bf20
- http://www.bubuko.com/infodetail-2995374.html
- https://blog.csdn.net/cauchy6317/article/details/92788938